Signed-off-by: Andrew Lee (李健秋) <ajqlee@debian.org>ubuntu/cosmic upstream/0.9.0
commit
cd4f0df87c
@ -0,0 +1 @@
|
|||||||
|
build
|
@ -0,0 +1,13 @@
|
|||||||
|
Upstream Authors:
|
||||||
|
LXQt team: http://lxqt.org
|
||||||
|
Razor team: http://razor-qt.org
|
||||||
|
|
||||||
|
Copyright:
|
||||||
|
Copyright (c) 2010-2012 Razor team
|
||||||
|
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 lxqt-config-cursor component is based on the "qt-xcurtheme" project
|
||||||
|
and is licensed under GPL 2.
|
@ -0,0 +1,44 @@
|
|||||||
|
cmake_minimum_required(VERSION 2.8.11)
|
||||||
|
|
||||||
|
project(lxqt-config)
|
||||||
|
|
||||||
|
option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
|
||||||
|
|
||||||
|
# Set default installation paths
|
||||||
|
set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}" CACHE PATH "Installation path for libraries")
|
||||||
|
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
|
||||||
|
find_package(Qt5Widgets REQUIRED QUIET)
|
||||||
|
find_package(Qt5DBus REQUIRED QUIET)
|
||||||
|
find_package(Qt5Xml REQUIRED QUIET)
|
||||||
|
find_package(Qt5Concurrent REQUIRED QUIET)
|
||||||
|
find_package(Qt5X11Extras REQUIRED QUIET)
|
||||||
|
find_package(Qt5LinguistTools REQUIRED QUIET)
|
||||||
|
find_package(lxqt REQUIRED QUIET)
|
||||||
|
find_package(qt5xdg REQUIRED)
|
||||||
|
find_package(KF5WindowSystem REQUIRED QUIET)
|
||||||
|
|
||||||
|
include(${LXQT_USE_FILE})
|
||||||
|
include(${QTXDG_USE_FILE})
|
||||||
|
|
||||||
|
include(LXQtTranslate)
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
||||||
|
add_subdirectory(liblxqt-config-cursor)
|
||||||
|
add_subdirectory(lxqt-config-input)
|
||||||
|
add_subdirectory(lxqt-config-file-associations)
|
||||||
|
add_subdirectory(lxqt-config-appearance)
|
||||||
|
add_subdirectory(lxqt-config-monitor)
|
||||||
|
|
||||||
|
# building tarball with CPack -------------------------------------------------
|
||||||
|
include(InstallRequiredSystemLibraries)
|
||||||
|
set(CPACK_PACKAGE_VERSION_MAJOR ${LXQT_MAJOR_VERSION})
|
||||||
|
set(CPACK_PACKAGE_VERSION_MINOR ${LXQT_MINOR_VERSION})
|
||||||
|
set(CPACK_PACKAGE_VERSION_PATCH ${LXQT_PATCH_VERSION})
|
||||||
|
set(CPACK_GENERATOR TBZ2)
|
||||||
|
set(CPACK_SOURCE_GENERATOR TBZ2)
|
||||||
|
set(CPACK_SOURCE_IGNORE_FILES /build/;.gitignore;.*~;.git;.kdev4;temp)
|
||||||
|
include(CPack)
|
@ -0,0 +1,461 @@
|
|||||||
|
|
||||||
|
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
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
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
|
||||||
|
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.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
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.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
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.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
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.
|
||||||
|
|
||||||
|
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
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
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.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
@ -0,0 +1,89 @@
|
|||||||
|
project(lxqt-config-cursor)
|
||||||
|
find_package(X11 REQUIRED)
|
||||||
|
|
||||||
|
find_package(PkgConfig REQUIRED)
|
||||||
|
|
||||||
|
pkg_check_modules(XCB REQUIRED xcb)
|
||||||
|
include_directories(${XCB_INCLUDE_DIRS})
|
||||||
|
link_libraries(${XCB_LIBRARIES})
|
||||||
|
|
||||||
|
include_directories (
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
${X11_INCLUDE_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/xcr
|
||||||
|
)
|
||||||
|
|
||||||
|
set(lxqt-config-cursor_HDRS
|
||||||
|
thememodel.h
|
||||||
|
previewwidget.h
|
||||||
|
itemdelegate.h
|
||||||
|
selectwnd.h
|
||||||
|
warninglabel.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(lxqt-config-cursor_SRCS
|
||||||
|
crtheme.cpp
|
||||||
|
selectwnd.cpp
|
||||||
|
xcr/xcrimg.cpp
|
||||||
|
xcr/xcrxcur.cpp
|
||||||
|
xcr/xcrthemefx.cpp
|
||||||
|
xcr/xcrtheme.cpp
|
||||||
|
xcr/xcrthemexp.cpp
|
||||||
|
cfgfile.cpp
|
||||||
|
previewwidget.cpp
|
||||||
|
itemdelegate.cpp
|
||||||
|
thememodel.cpp
|
||||||
|
warninglabel.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(lxqt-config-cursor_UIS
|
||||||
|
ui/selectwnd.ui
|
||||||
|
ui/warninglabel.ui
|
||||||
|
)
|
||||||
|
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
|
||||||
|
qt5_wrap_ui(lxqt-config-cursor_CXX ${lxqt-config-cursor_UIS})
|
||||||
|
|
||||||
|
# Translations **********************************
|
||||||
|
lxqt_translate_ts(QM_FILES
|
||||||
|
UPDATE_TRANSLATIONS
|
||||||
|
${UPDATE_TRANSLATIONS}
|
||||||
|
SOURCES
|
||||||
|
${lxqt-config-cursor_HDRS}
|
||||||
|
${lxqt-config-cursor_SRCS}
|
||||||
|
${lxqt-config-cursor_UIS}
|
||||||
|
INSTALL_DIR
|
||||||
|
"${LXQT_TRANSLATIONS_DIR}/${PROJECT_NAME}"
|
||||||
|
)
|
||||||
|
|
||||||
|
lxqt_app_translation_loader(lxqt-config-cursor_QM_LOADER ${PROJECT_NAME})
|
||||||
|
|
||||||
|
#************************************************
|
||||||
|
|
||||||
|
add_library(lxqt-config-cursor
|
||||||
|
SHARED
|
||||||
|
${lxqt-config-cursor_SRCS}
|
||||||
|
${lxqt-config-cursor_CXX}
|
||||||
|
${lxqt-config-cursor_MOCS}
|
||||||
|
${DESKTOP_FILES}
|
||||||
|
${QM_FILES}
|
||||||
|
${lxqt-config-cursor_QM_LOADER}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(lxqt-config-cursor
|
||||||
|
Qt5::X11Extras
|
||||||
|
Qt5::DBus
|
||||||
|
Qt5::Xml
|
||||||
|
${X11_X11_LIB}
|
||||||
|
${X11_Xcursor_LIB}
|
||||||
|
${LXQT_LIBRARIES}
|
||||||
|
${QTXDG_LIBRARIES}
|
||||||
|
${ZLIB_LIBRARY}
|
||||||
|
${X11_Xfixes_LIB}
|
||||||
|
)
|
||||||
|
# not needed probably ${X11_Xfixes_LIB})
|
||||||
|
|
||||||
|
install(TARGETS lxqt-config-cursor DESTINATION ${LIB_INSTALL_DIR})
|
||||||
|
install(FILES ${DESKTOP_FILES} DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
|
@ -0,0 +1,122 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include "cfgfile.h"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
QMultiMap<QString, QString> loadCfgFile(const QString &fname, bool forceLoCase)
|
||||||
|
{
|
||||||
|
QMultiMap<QString, QString> res;
|
||||||
|
QFile fl(fname);
|
||||||
|
if (fl.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
QString curPath = "/";
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull()) break;
|
||||||
|
s = s.trimmed();
|
||||||
|
if (s.isEmpty() || s[0] == '#' || s[0] == ';') continue;
|
||||||
|
if (s[0] == '[')
|
||||||
|
{
|
||||||
|
// new path
|
||||||
|
int len = s.length()-1;
|
||||||
|
if (s[len] == ']') len--;
|
||||||
|
s = s.mid(1, len).simplified();
|
||||||
|
s += '/';
|
||||||
|
curPath = s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int eqp = s.indexOf('=');
|
||||||
|
if (eqp < 0) continue; // invalid entry
|
||||||
|
QString name = s.left(eqp).simplified();
|
||||||
|
QString value = s.mid(eqp+1).simplified();
|
||||||
|
if (name.isEmpty()) continue; // invalid entry
|
||||||
|
name.prepend(curPath);
|
||||||
|
if (forceLoCase) name = name.toLower();
|
||||||
|
res.insert(name, value);
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fixXDefaults(const QString &themeName)
|
||||||
|
{
|
||||||
|
QStringList lst;
|
||||||
|
{
|
||||||
|
QFile fl(QDir::home().path()+"/.Xdefaults");
|
||||||
|
if (fl.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull())
|
||||||
|
break;
|
||||||
|
// if the line does not contain Xcursor?theme, save it to a list
|
||||||
|
if (!(s.startsWith(QLatin1String("Xcursor")) && s.midRef(8).startsWith(QLatin1String("theme"))))
|
||||||
|
lst << s;
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (lst.size() > 0)
|
||||||
|
{
|
||||||
|
QString s(lst[lst.size()-1]);
|
||||||
|
if (!s.trimmed().isEmpty()) break;
|
||||||
|
lst.removeAt(lst.size()-1);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
//QByteArray ba(themeName.toUtf8());
|
||||||
|
QFile fl(QDir::home().path()+"/.Xdefaults");
|
||||||
|
if (fl.open(QIODevice::WriteOnly))
|
||||||
|
{
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
foreach (const QString &s, lst)
|
||||||
|
{
|
||||||
|
stream << s << "\n";
|
||||||
|
}
|
||||||
|
stream << "\nXcursor.theme: " << themeName << "\n";
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString findDefaultTheme()
|
||||||
|
{
|
||||||
|
QString res = "default";
|
||||||
|
QFile fl(QDir::home().path()+"/.Xdefaults");
|
||||||
|
if (fl.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull()) break;
|
||||||
|
if (!s.startsWith("Xcursor.theme:")) continue;
|
||||||
|
s.remove(0, 14);
|
||||||
|
s = s.trimmed();
|
||||||
|
if (s.isEmpty()) s = "default";
|
||||||
|
res = s;
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef CFGFILE_H
|
||||||
|
#define CFGFILE_H
|
||||||
|
|
||||||
|
#include <QMultiMap>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
QMultiMap<QString, QString> loadCfgFile(const QString &fname, bool forceLoCase=false);
|
||||||
|
void fixXDefaults(const QString &themeName);
|
||||||
|
const QString findDefaultTheme();
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,276 @@
|
|||||||
|
/* Copyright © 2006-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "crtheme.h"
|
||||||
|
|
||||||
|
#include <QStyle>
|
||||||
|
#include <QX11Info>
|
||||||
|
|
||||||
|
#include "cfgfile.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
|
// Static variable holding alternative names for some cursors
|
||||||
|
static QHash<QString, QString> alternatives;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorThemeData::XCursorThemeData(const QDir &aDir)
|
||||||
|
{
|
||||||
|
mHidden = false;
|
||||||
|
// parse configs, etc
|
||||||
|
mPath = aDir.path();
|
||||||
|
setName(aDir.dirName());
|
||||||
|
if (aDir.exists("index.theme")) parseIndexFile();
|
||||||
|
if (mDescription.isEmpty()) mDescription = "no description";
|
||||||
|
if (mTitle.isEmpty()) mTitle = mName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCursorThemeData::parseIndexFile()
|
||||||
|
{
|
||||||
|
QMultiMap<QString, QString> cfg = loadCfgFile(mPath+"/index.theme", true);
|
||||||
|
if (cfg.contains("icon theme/name")) mTitle = cfg.values("icon theme/name").at(0).trimmed();
|
||||||
|
if (cfg.contains("icon theme/comment")) mDescription = cfg.values("icon theme/comment").at(0).trimmed();
|
||||||
|
if (cfg.contains("icon theme/example")) mSample = cfg.values("icon theme/example").at(0).trimmed();
|
||||||
|
if (cfg.contains("icon theme/hidden"))
|
||||||
|
{
|
||||||
|
QString hiddenValue = cfg.values("icon theme/hidden").at(0).toLower();
|
||||||
|
mHidden = hiddenValue=="false" ? false : true;
|
||||||
|
}
|
||||||
|
if (cfg.contains("icon theme/inherits"))
|
||||||
|
{
|
||||||
|
QStringList i = cfg.values("icon theme/inherits"), res;
|
||||||
|
for (int f = i.size()-1; f >= 0; f--) res << i.at(f).trimmed();
|
||||||
|
}
|
||||||
|
if (mDescription.startsWith("- Converted by")) mDescription.remove(0, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString XCursorThemeData::findAlternative(const QString &name) const
|
||||||
|
{
|
||||||
|
if (alternatives.isEmpty())
|
||||||
|
{
|
||||||
|
alternatives.reserve(18);
|
||||||
|
|
||||||
|
// Qt uses non-standard names for some core cursors.
|
||||||
|
// If Xcursor fails to load the cursor, Qt creates it with the correct name using the
|
||||||
|
// core protcol instead (which in turn calls Xcursor). We emulate that process here.
|
||||||
|
// Note that there's a core cursor called cross, but it's not the one Qt expects.
|
||||||
|
alternatives.insert("cross", "crosshair");
|
||||||
|
alternatives.insert("up_arrow", "center_ptr");
|
||||||
|
alternatives.insert("wait", "watch");
|
||||||
|
alternatives.insert("ibeam", "xterm");
|
||||||
|
alternatives.insert("size_all", "fleur");
|
||||||
|
alternatives.insert("pointing_hand", "hand2");
|
||||||
|
|
||||||
|
// Precomputed MD5 hashes for the hardcoded bitmap cursors in Qt and KDE.
|
||||||
|
// Note that the MD5 hash for left_ptr_watch is for the KDE version of that cursor.
|
||||||
|
alternatives.insert("size_ver", "00008160000006810000408080010102");
|
||||||
|
alternatives.insert("size_hor", "028006030e0e7ebffc7f7070c0600140");
|
||||||
|
alternatives.insert("size_bdiag", "c7088f0f3e6c8088236ef8e1e3e70000");
|
||||||
|
alternatives.insert("size_fdiag", "fcf1c3c7cd4491d801f1e1c78f100000");
|
||||||
|
alternatives.insert("whats_this", "d9ce0ab605698f320427677b458ad60b");
|
||||||
|
alternatives.insert("split_h", "14fef782d02440884392942c11205230");
|
||||||
|
alternatives.insert("split_v", "2870a09082c103050810ffdffffe0204");
|
||||||
|
alternatives.insert("forbidden", "03b6e0fcb3499374a867c041f52298f0");
|
||||||
|
alternatives.insert("left_ptr_watch", "3ecb610c1bf2410f44200f48c40d3599");
|
||||||
|
alternatives.insert("hand2", "e29285e634086352946a0e7090d73106");
|
||||||
|
alternatives.insert("openhand", "9141b49c8149039304290b508d208c40");
|
||||||
|
alternatives.insert("closedhand", "05e88622050804100c20044008402080");
|
||||||
|
}
|
||||||
|
|
||||||
|
return alternatives.value(name, QString());
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap XCursorThemeData::icon() const
|
||||||
|
{
|
||||||
|
if (mIcon.isNull()) mIcon = createIcon();
|
||||||
|
return mIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage XCursorThemeData::autoCropImage(const QImage &image) const
|
||||||
|
{
|
||||||
|
// Compute an autocrop rectangle for the image
|
||||||
|
QRect r(image.rect().bottomRight(), image.rect().topLeft());
|
||||||
|
const quint32 *pixels = reinterpret_cast<const quint32*>(image.bits());
|
||||||
|
for (int y = 0; y < image.height(); ++y)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < image.width(); ++x)
|
||||||
|
{
|
||||||
|
if (*(pixels++))
|
||||||
|
{
|
||||||
|
if (x < r.left()) r.setLeft(x);
|
||||||
|
if (x > r.right()) r.setRight(x);
|
||||||
|
if (y < r.top()) r.setTop(y);
|
||||||
|
if (y > r.bottom()) r.setBottom(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Normalize the rectangle
|
||||||
|
return image.copy(r.normalized());
|
||||||
|
}
|
||||||
|
|
||||||
|
static int nominalCursorSize(int iconSize)
|
||||||
|
{
|
||||||
|
for (int i = 512; i > 8; i /= 2)
|
||||||
|
{
|
||||||
|
if (i < iconSize) return i;
|
||||||
|
if ((i*0.75) < iconSize) return int(i*0.75);
|
||||||
|
}
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap XCursorThemeData::createIcon() const
|
||||||
|
{
|
||||||
|
int iconSize = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize);
|
||||||
|
int cursorSize = nominalCursorSize(iconSize);
|
||||||
|
QSize size = QSize(iconSize, iconSize);
|
||||||
|
|
||||||
|
QPixmap pixmap;
|
||||||
|
QImage image = loadImage(sample(), cursorSize);
|
||||||
|
if (image.isNull() && sample() != "left_ptr") image = loadImage("left_ptr", cursorSize);
|
||||||
|
if (!image.isNull())
|
||||||
|
{
|
||||||
|
// Scale the image if it's larger than the preferred icon size
|
||||||
|
if (image.width() > size.width() || image.height() > size.height())
|
||||||
|
{
|
||||||
|
image = image.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
pixmap = QPixmap::fromImage(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
XcursorImage *XCursorThemeData::xcLoadImage(const QString &image, int size) const
|
||||||
|
{
|
||||||
|
QByteArray cursorName = QFile::encodeName(image);
|
||||||
|
QByteArray themeName = QFile::encodeName(name());
|
||||||
|
return XcursorLibraryLoadImage(cursorName, themeName, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
XcursorImages *XCursorThemeData::xcLoadImages(const QString &image, int size) const
|
||||||
|
{
|
||||||
|
QByteArray cursorName = QFile::encodeName(image);
|
||||||
|
QByteArray themeName = QFile::encodeName(name());
|
||||||
|
return XcursorLibraryLoadImages(cursorName, themeName, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long XCursorThemeData::loadCursorHandle(const QString &name, int size) const
|
||||||
|
{
|
||||||
|
if (size == -1) size = XcursorGetDefaultSize(QX11Info::display());
|
||||||
|
// Load the cursor images
|
||||||
|
XcursorImages *images = xcLoadImages(name, size);
|
||||||
|
if (!images) images = xcLoadImages(findAlternative(name), size);
|
||||||
|
// Fall back to a legacy cursor
|
||||||
|
//if (!images) return LegacyTheme::loadCursor(name);
|
||||||
|
if (!images) return 0;
|
||||||
|
// Create the cursor
|
||||||
|
unsigned long handle = (unsigned long)XcursorImagesLoadCursor(QX11Info::display(), images);
|
||||||
|
XcursorImagesDestroy(images);
|
||||||
|
//setCursorName(cursor, name);
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
QImage XCursorThemeData::loadImage(const QString &name, int size) const
|
||||||
|
{
|
||||||
|
if (size == -1) size = XcursorGetDefaultSize(QX11Info::display());
|
||||||
|
// Load the image
|
||||||
|
XcursorImage *xcimage = xcLoadImage(name, size);
|
||||||
|
if (!xcimage) xcimage = xcLoadImage(findAlternative(name), size);
|
||||||
|
// Fall back to a legacy cursor
|
||||||
|
//if (!xcimage) return LegacyTheme::loadImage(name);
|
||||||
|
if (!xcimage) return QImage();
|
||||||
|
// Convert the XcursorImage to a QImage, and auto-crop it
|
||||||
|
QImage image((uchar *)xcimage->pixels, xcimage->width, xcimage->height, QImage::Format_ARGB32_Premultiplied);
|
||||||
|
image = autoCropImage(image);
|
||||||
|
XcursorImageDestroy(xcimage);
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool XCursorThemeData::isWritable() const
|
||||||
|
{
|
||||||
|
QFileInfo fi(path());
|
||||||
|
return fi.isWritable();
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
bool haveXfixes()
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
int event_base, error_base;
|
||||||
|
if (XFixesQueryExtension(QX11Info::display(), &event_base, &error_base))
|
||||||
|
{
|
||||||
|
int major, minor;
|
||||||
|
XFixesQueryVersion(QX11Info::display(), &major, &minor);
|
||||||
|
result = (major >= 2);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool applyTheme(const XCursorThemeData &theme)
|
||||||
|
{
|
||||||
|
// Require the Xcursor version that shipped with X11R6.9 or greater, since
|
||||||
|
// in previous versions the Xfixes code wasn't enabled due to a bug in the
|
||||||
|
// build system (freedesktop bug #975).
|
||||||
|
if (!haveXfixes()) return false;
|
||||||
|
|
||||||
|
QByteArray themeName = QFile::encodeName(theme.name());
|
||||||
|
|
||||||
|
// Set up the proper launch environment for newly started apps
|
||||||
|
//k8:!!!:KToolInvocation::klauncher()->setLaunchEnv("XCURSOR_THEME", themeName);
|
||||||
|
|
||||||
|
// Update the Xcursor X resources
|
||||||
|
//k8:!!!:runRdb(0);
|
||||||
|
|
||||||
|
// Reload the standard cursors
|
||||||
|
QStringList names;
|
||||||
|
// Qt cursors
|
||||||
|
names << "left_ptr" << "up_arrow" << "cross" << "wait"
|
||||||
|
<< "left_ptr_watch" << "ibeam" << "size_ver" << "size_hor"
|
||||||
|
<< "size_bdiag" << "size_fdiag" << "size_all" << "split_v"
|
||||||
|
<< "split_h" << "pointing_hand" << "openhand"
|
||||||
|
<< "closedhand" << "forbidden" << "whats_this";
|
||||||
|
// X core cursors
|
||||||
|
names << "X_cursor" << "right_ptr" << "hand1"
|
||||||
|
<< "hand2" << "watch" << "xterm"
|
||||||
|
<< "crosshair" << "left_ptr_watch" << "center_ptr"
|
||||||
|
<< "sb_h_double_arrow" << "sb_v_double_arrow" << "fleur"
|
||||||
|
<< "top_left_corner" << "top_side" << "top_right_corner"
|
||||||
|
<< "right_side" << "bottom_right_corner" << "bottom_side"
|
||||||
|
<< "bottom_left_corner" << "left_side" << "question_arrow"
|
||||||
|
<< "pirate";
|
||||||
|
|
||||||
|
//QX11Info x11Info;
|
||||||
|
foreach (const QString &name, names)
|
||||||
|
{
|
||||||
|
Cursor cursor = (Cursor)theme.loadCursorHandle(name);
|
||||||
|
XFixesChangeCursorByName(QX11Info::display(), cursor, QFile::encodeName(name));
|
||||||
|
// FIXME: do we need to free the cursor?
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString getCurrentTheme()
|
||||||
|
{
|
||||||
|
return XcursorGetTheme(QX11Info::display());
|
||||||
|
}
|
@ -0,0 +1,119 @@
|
|||||||
|
/* Copyright © 2006-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#ifndef CRTHEME_H
|
||||||
|
#define CRTHEME_H
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QIcon>
|
||||||
|
#include <QImage>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
#include <xcb/xcb.h>
|
||||||
|
#include <xcb/xproto.h>
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
// X11 is SHIT!
|
||||||
|
struct _XcursorImage;
|
||||||
|
struct _XcursorImages;
|
||||||
|
|
||||||
|
typedef _XcursorImage XcursorImage;
|
||||||
|
typedef _XcursorImages XcursorImages;
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class XCursorThemeData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum ItemDataRole {
|
||||||
|
// Note: use printf "0x%08X\n" $(($RANDOM*$RANDOM))
|
||||||
|
// to define additional roles.
|
||||||
|
DisplayDetailRole = 0x24A3DAF8
|
||||||
|
};
|
||||||
|
|
||||||
|
XCursorThemeData(const QDir &aDir);
|
||||||
|
|
||||||
|
const QString &name() const { return mName; }
|
||||||
|
const QString &title() const { return mTitle; }
|
||||||
|
const QString &description() const { return mDescription; }
|
||||||
|
const QString &sample() const { return mSample; }
|
||||||
|
const QString &path() const { return mPath; }
|
||||||
|
bool isHidden() const { return mHidden; }
|
||||||
|
QPixmap icon() const;
|
||||||
|
const QStringList &inherits() const { return mInherits; }
|
||||||
|
|
||||||
|
inline void setName(const QString &name)
|
||||||
|
{
|
||||||
|
mName = name;
|
||||||
|
mHash = qHash(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isWritable() const;
|
||||||
|
|
||||||
|
/// Hash value for the internal name
|
||||||
|
uint hash() const { return mHash; }
|
||||||
|
|
||||||
|
/// Loads the cursor @p name, with the nominal size @p size.
|
||||||
|
/// If the theme doesn't have the cursor @p name, it should return
|
||||||
|
/// the default cursor from the active theme instead.
|
||||||
|
unsigned long loadCursorHandle(const QString &name, int size=-1) const;
|
||||||
|
|
||||||
|
/// Loads the cursor image @p name, with the nominal size @p size.
|
||||||
|
/// The image should be autocropped to the smallest possible size.
|
||||||
|
/// If the theme doesn't have the cursor @p name, it should return a null image.
|
||||||
|
QImage loadImage(const QString &name, int size=-1) const;
|
||||||
|
|
||||||
|
XcursorImage *xcLoadImage(const QString &image, int size=-1) const;
|
||||||
|
XcursorImages *xcLoadImages(const QString &image, int size=-1) const;
|
||||||
|
|
||||||
|
QString findAlternative(const QString &name) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void parseIndexFile();
|
||||||
|
|
||||||
|
/// Creates the icon returned by @ref icon().
|
||||||
|
QPixmap createIcon() const;
|
||||||
|
|
||||||
|
/// Convenience function for cropping an image.
|
||||||
|
QImage autoCropImage(const QImage &image) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString mName;
|
||||||
|
QString mTitle;
|
||||||
|
QString mDescription;
|
||||||
|
QString mPath;
|
||||||
|
QString mSample;
|
||||||
|
mutable QPixmap mIcon;
|
||||||
|
bool mHidden;
|
||||||
|
uint mHash;
|
||||||
|
QStringList mInherits;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool haveXfixes();
|
||||||
|
bool applyTheme(const XCursorThemeData &theme);
|
||||||
|
|
||||||
|
QString getCurrentTheme();
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,141 @@
|
|||||||
|
/* Copyright © 2006-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#include "itemdelegate.h"
|
||||||
|
#include "crtheme.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QModelIndex>
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
const int decorationMargin = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
ItemDelegate::ItemDelegate(QObject *parent) : QAbstractItemDelegate(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ItemDelegate::~ItemDelegate()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ItemDelegate::firstLine(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.isValid()) return index.model()->data(index, Qt::DisplayRole).toString();
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ItemDelegate::secondLine(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.isValid()) return index.model()->data(index, XCursorThemeData::DisplayDetailRole).toString();
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QPixmap ItemDelegate::decoration(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (index.isValid()) return qvariant_cast<QPixmap>(index.model()->data(index, Qt::DecorationRole));
|
||||||
|
return QPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
QSize ItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid()) return QSize();
|
||||||
|
|
||||||
|
QFont normalfont = option.font;
|
||||||
|
QFont boldfont = normalfont;
|
||||||
|
boldfont.setBold(true);
|
||||||
|
// Extract the items we want to measure
|
||||||
|
QString firstRow = firstLine(index);
|
||||||
|
QString secondRow = secondLine(index);
|
||||||
|
// Compute the height
|
||||||
|
QFontMetrics fm1(boldfont);
|
||||||
|
QFontMetrics fm2(normalfont);
|
||||||
|
int height = fm1.lineSpacing() + fm2.lineSpacing();
|
||||||
|
height = qMax(height, option.decorationSize.height());
|
||||||
|
// Compute the text width
|
||||||
|
int width = fm1.width(firstRow);
|
||||||
|
width = qMax(width, fm2.width(secondRow));
|
||||||
|
// Add decoration width + margin
|
||||||
|
width += option.decorationSize.width()+decorationMargin;
|
||||||
|
return QSize(width, height+16);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPalette::ColorRole ItemDelegate::foregroundRole(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
Q_UNUSED(index)
|
||||||
|
if (option.state & QStyle::State_Selected) return QPalette::HighlightedText;
|
||||||
|
return QPalette::Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid()) return;
|
||||||
|
painter->save();
|
||||||
|
|
||||||
|
QFont normalfont = option.font;
|
||||||
|
QFont boldfont = normalfont;
|
||||||
|
boldfont.setBold(true);
|
||||||
|
|
||||||
|
QString firstRow = firstLine(index);
|
||||||
|
QString secondRow = secondLine(index);
|
||||||
|
QPixmap pixmap = decoration(index);
|
||||||
|
|
||||||
|
QColor textcol = option.palette.color(foregroundRole(option, index));
|
||||||
|
|
||||||
|
// Draw the background
|
||||||
|
QStyleOptionViewItemV4 opt = option;
|
||||||
|
QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
|
||||||
|
style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
|
||||||
|
|
||||||
|
// Draw the icon
|
||||||
|
int x = option.rect.left()+(option.decorationSize.width()-pixmap.width()+decorationMargin)/2;
|
||||||
|
int y = option.rect.top()+(option.rect.height()-pixmap.height())/2;
|
||||||
|
QRect pixmapRect = QStyle::visualRect(option.direction, option.rect, QRect(x, y, pixmap.width(), pixmap.height()));
|
||||||
|
painter->drawPixmap(pixmapRect.x(), pixmapRect.y(), pixmap);
|
||||||
|
|
||||||
|
// Draw the text
|
||||||
|
QFontMetrics fm1(boldfont);
|
||||||
|
QFontMetrics fm2(normalfont);
|
||||||
|
|
||||||
|
int textAreaHeight = fm1.lineSpacing()+fm2.lineSpacing();
|
||||||
|
|
||||||
|
x = option.rect.left()+option.decorationSize.width()+decorationMargin;
|
||||||
|
int y1 = option.rect.top()+(option.rect.height()-textAreaHeight)/2;
|
||||||
|
int y2 = y1+fm1.lineSpacing();
|
||||||
|
QRect firstRowRect = QStyle::visualRect(option.direction, option.rect, QRect(x, y1, fm1.width(firstRow), fm1.lineSpacing()));
|
||||||
|
QRect secondRowRect = QStyle::visualRect(option.direction, option.rect, QRect(x, y2, fm2.width(secondRow), fm2.lineSpacing()));
|
||||||
|
painter->setPen(textcol);
|
||||||
|
|
||||||
|
// First line
|
||||||
|
painter->setFont(boldfont);
|
||||||
|
painter->drawText(firstRowRect, Qt::AlignCenter, firstRow);
|
||||||
|
|
||||||
|
// Second line
|
||||||
|
painter->setFont(normalfont);
|
||||||
|
painter->drawText(secondRowRect, Qt::AlignCenter, secondRow);
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
/* Copyright © 2006-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#ifndef ITEMDELEGATE_H
|
||||||
|
#define ITEMDELEGATE_H
|
||||||
|
|
||||||
|
#include <QAbstractItemDelegate>
|
||||||
|
|
||||||
|
class QPainter;
|
||||||
|
|
||||||
|
|
||||||
|
class ItemDelegate : public QAbstractItemDelegate
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ItemDelegate(QObject *parent = 0);
|
||||||
|
~ItemDelegate();
|
||||||
|
|
||||||
|
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString firstLine(const QModelIndex &index) const;
|
||||||
|
QString secondLine(const QModelIndex &index) const;
|
||||||
|
QPixmap decoration(const QModelIndex &index) const;
|
||||||
|
QPalette::ColorRole foregroundRole(const QStyleOptionViewItem &option, const QModelIndex &index) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,42 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
//#include <QtCore>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <XdgIcon>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
#include "main.h"
|
||||||
|
#include "lxqttranslate.h"
|
||||||
|
|
||||||
|
#include <LXQt/Application>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QImage>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextCodec>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
int main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
//QTextCodec::setCodecForCStrings(QTextCodec::codecForName("koi8-r"));
|
||||||
|
//QTextCodec::setCodecForLocale(QTextCodec::codecForName("koi8-r"));
|
||||||
|
|
||||||
|
LxQt::Application app(argc, argv);
|
||||||
|
TRANSLATE_APP;
|
||||||
|
|
||||||
|
//qDebug() << findDefaultTheme() << getCurrentTheme();
|
||||||
|
|
||||||
|
SelectWnd *sw = new SelectWnd;
|
||||||
|
sw->show();
|
||||||
|
sw->setCurrent();
|
||||||
|
return app.exec();
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef MAIN_H
|
||||||
|
#define MAIN_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "cfgfile.h"
|
||||||
|
#include "crtheme.h"
|
||||||
|
#include "selectwnd.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,39 @@
|
|||||||
|
.TH lxqt-config-cursor "1" "September 2012" "LXQt\-qt\ 0.7.0" "LXQt\ Cursor settings"
|
||||||
|
.SH NAME
|
||||||
|
lxqt-config-cursor \- Application of \fBLXQt\fR: the faster and lighter QT Desktop Environment
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B lxqt-config-cursor
|
||||||
|
.br
|
||||||
|
.SH DESCRIPTION
|
||||||
|
This its a simple GUI cursor theme configuraton (by the moment) for the LXQt desktop environment.
|
||||||
|
Also can manage theme installation for it (localy for/per user only).
|
||||||
|
.P
|
||||||
|
\fBLXQt\fR is an advanced, easy-to-use, and fast desktop environment based on Qt
|
||||||
|
technologies, ships several core desktop components, all of which are optional:
|
||||||
|
.P
|
||||||
|
* Panel
|
||||||
|
* Desktop
|
||||||
|
* Application launcher
|
||||||
|
* Settings center \fI(related to this)\fR
|
||||||
|
* Session handler
|
||||||
|
* Polkit handler
|
||||||
|
* SSH password access
|
||||||
|
* Display manager handler
|
||||||
|
.P
|
||||||
|
These components perform similar actions to those available in other desktop
|
||||||
|
environments, and their name is self-descriptive. They are usually not launched
|
||||||
|
by hand but automatically, when choosing a \fBLXQt\-qt\fR session in the Display
|
||||||
|
Manager.
|
||||||
|
.P
|
||||||
|
.SH "REPORTING BUGS"
|
||||||
|
Report bugs to https://github.com/lxde/lxde-qt/issues
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
\fBLXQt\fR it has been tailored for users who value simplicity, speed, and
|
||||||
|
an intuitive interface, also intended for less powerful machines. See also:
|
||||||
|
.\" any module must refers to session app, for more info on start it
|
||||||
|
.P
|
||||||
|
\fBlxqt-config.1\fR LXQt application for performing settings on many applications
|
||||||
|
.P
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was created by \fBPICCORO Lenz McKAY\fR \fI<mckaygerhard@gmail.com>\fR
|
||||||
|
for \fBLXQt\fR project and VENENUX GNU/Linux but can be used by others.
|
@ -0,0 +1,221 @@
|
|||||||
|
/* Copyright © 2003-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
|
||||||
|
#include "previewwidget.h"
|
||||||
|
|
||||||
|
#include "crtheme.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
|
||||||
|
#include <QX11Info>
|
||||||
|
#include <QWindow>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
// Preview cursors
|
||||||
|
const char *const cursorNames[] = {
|
||||||
|
"left_ptr",
|
||||||
|
"left_ptr_watch",
|
||||||
|
"wait",
|
||||||
|
"pointing_hand",
|
||||||
|
"whats_this",
|
||||||
|
"ibeam",
|
||||||
|
"size_all",
|
||||||
|
"size_fdiag",
|
||||||
|
"cross",
|
||||||
|
"split_h",
|
||||||
|
"size_ver",
|
||||||
|
"size_hor",
|
||||||
|
"size_bdiag",
|
||||||
|
"split_v",
|
||||||
|
};
|
||||||
|
|
||||||
|
const int numCursors = 9; // The number of cursors from the above list to be previewed
|
||||||
|
const int previewSize = 24; // The nominal cursor size to be used in the preview widget
|
||||||
|
const int cursorSpacing = 20; // Spacing between preview cursors
|
||||||
|
const int widgetMinWidth = 10; // The minimum width of the preview widget
|
||||||
|
const int widgetMinHeight = 48; // The minimum height of the preview widget
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class PreviewCursor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PreviewCursor (const XCursorThemeData &theme, const QString &name);
|
||||||
|
~PreviewCursor () {}
|
||||||
|
|
||||||
|
const QPixmap &pixmap () const { return mPixmap; }
|
||||||
|
int width () const { return mPixmap.width(); }
|
||||||
|
int height () const { return mPixmap.height(); }
|
||||||
|
inline QRect rect () const;
|
||||||
|
void setPosition (const QPoint &p) { mPos = p; }
|
||||||
|
void setPosition (int x, int y) { mPos = QPoint(x, y); }
|
||||||
|
QPoint position () const { return mPos; }
|
||||||
|
operator const xcb_cursor_t& () const { return mCursorHandle; }
|
||||||
|
operator const QPixmap& () const { return pixmap(); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPixmap mPixmap;
|
||||||
|
xcb_cursor_t mCursorHandle;
|
||||||
|
QPoint mPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
PreviewCursor::PreviewCursor(const XCursorThemeData &theme, const QString &name)
|
||||||
|
{
|
||||||
|
// Create the preview pixmap
|
||||||
|
QImage image = theme.loadImage(name, previewSize);
|
||||||
|
if (image.isNull()) return;
|
||||||
|
int maxSize = previewSize*2;
|
||||||
|
if (image.height() > maxSize || image.width() > maxSize)
|
||||||
|
image = image.scaled(maxSize, maxSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
mPixmap = QPixmap::fromImage(image);
|
||||||
|
// load the cursor
|
||||||
|
mCursorHandle = theme.loadCursorHandle(name, previewSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect PreviewCursor::rect() const
|
||||||
|
{
|
||||||
|
return QRect(mPos, mPixmap.size()).adjusted(-(cursorSpacing/2), -(cursorSpacing/2), cursorSpacing/2, cursorSpacing/2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
PreviewWidget::PreviewWidget(QWidget *parent) : QWidget(parent)
|
||||||
|
{
|
||||||
|
setMouseTracking(true);
|
||||||
|
mCurrent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PreviewWidget::~PreviewWidget()
|
||||||
|
{
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Since Qt5, wrapping a Cursor handle with QCursor is no longer supported.
|
||||||
|
// So we have to do it ourselves. I really hate Qt 5!
|
||||||
|
void PreviewWidget::setCursorHandle(xcb_cursor_t cursorHandle)
|
||||||
|
{
|
||||||
|
WId wid = nativeParentWidget()->windowHandle()->winId();
|
||||||
|
xcb_change_window_attributes(QX11Info::connection(), wid, XCB_CW_CURSOR, &cursorHandle);
|
||||||
|
xcb_flush(QX11Info::connection());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QSize PreviewWidget::sizeHint() const
|
||||||
|
{
|
||||||
|
int totalWidth = 0, maxHeight = 0;
|
||||||
|
foreach (const PreviewCursor *c, mList)
|
||||||
|
{
|
||||||
|
totalWidth += c->width();
|
||||||
|
maxHeight = qMax(c->height(), maxHeight);
|
||||||
|
}
|
||||||
|
totalWidth += (mList.count()-1)*cursorSpacing;
|
||||||
|
maxHeight = qMax(maxHeight, widgetMinHeight);
|
||||||
|
return QSize(qMax(totalWidth, widgetMinWidth), qMax(height(), maxHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWidget::layoutItems()
|
||||||
|
{
|
||||||
|
if (!mList.isEmpty())
|
||||||
|
{
|
||||||
|
QSize size = sizeHint();
|
||||||
|
int cursorWidth = size.width()/mList.count();
|
||||||
|
int nextX = (width()-size.width())/2;
|
||||||
|
foreach (PreviewCursor *c, mList)
|
||||||
|
{
|
||||||
|
c->setPosition(nextX+(cursorWidth-c->width())/2, (height()-c->height())/2);
|
||||||
|
nextX += cursorWidth;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mNeedLayout = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWidget::setTheme(const XCursorThemeData &theme)
|
||||||
|
{
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
for (int i = 0; i < numCursors; ++i) mList << new PreviewCursor(theme, cursorNames[i]);
|
||||||
|
mNeedLayout = true;
|
||||||
|
updateGeometry();
|
||||||
|
mCurrent = NULL;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PreviewWidget::clearTheme()
|
||||||
|
{
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
mCurrent = NULL;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWidget::paintEvent(QPaintEvent *)
|
||||||
|
{
|
||||||
|
QPainter p(this);
|
||||||
|
if (mNeedLayout) layoutItems();
|
||||||
|
foreach (const PreviewCursor *c, mList)
|
||||||
|
{
|
||||||
|
if (c->pixmap().isNull()) continue;
|
||||||
|
p.drawPixmap(c->position(), *c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWidget::mouseMoveEvent(QMouseEvent *e)
|
||||||
|
{
|
||||||
|
if (mNeedLayout) layoutItems();
|
||||||
|
foreach (const PreviewCursor *c, mList)
|
||||||
|
{
|
||||||
|
if (c->rect().contains(e->pos()))
|
||||||
|
{
|
||||||
|
if (c != mCurrent)
|
||||||
|
{
|
||||||
|
// NOTE: we have to set the Qt cursor value to something other than Qt::ArrowCursor
|
||||||
|
// Otherwise, though we set the xcursor handle to the underlying window, Qt still
|
||||||
|
// thinks that the current cursor is Qt::ArrowCursor and will not restore the cursor
|
||||||
|
// later when we call setCursor(Qt::ArrowCursor). So, we set it to BlankCursor to
|
||||||
|
// cheat Qt so it knows that the current cursor is not Qt::ArrowCursor.
|
||||||
|
// This is a dirty hack, but without this, Qt cannot restore Qt::ArrowCursor later.
|
||||||
|
setCursor(Qt::BlankCursor);
|
||||||
|
setCursorHandle(*c);
|
||||||
|
mCurrent = c;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setCursor(Qt::ArrowCursor);
|
||||||
|
mCurrent = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PreviewWidget::resizeEvent(QResizeEvent *)
|
||||||
|
{
|
||||||
|
if (!mList.isEmpty()) mNeedLayout = true;
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
/* Copyright © 2003-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#ifndef PREVIEWWIDGET_H
|
||||||
|
#define PREVIEWWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
#include <xcb/xcb.h>
|
||||||
|
#include <xcb/xproto.h>
|
||||||
|
|
||||||
|
class XCursorThemeData;
|
||||||
|
class PreviewCursor;
|
||||||
|
|
||||||
|
class PreviewWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
PreviewWidget (QWidget *parent=0);
|
||||||
|
~PreviewWidget ();
|
||||||
|
|
||||||
|
void setTheme (const XCursorThemeData &theme);
|
||||||
|
void clearTheme ();
|
||||||
|
|
||||||
|
QSize sizeHint () const;
|
||||||
|
|
||||||
|
void setCursorHandle(xcb_cursor_t cursorHandle);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent (QPaintEvent *e);
|
||||||
|
void mouseMoveEvent(QMouseEvent *e);
|
||||||
|
void resizeEvent (QResizeEvent *e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void layoutItems ();
|
||||||
|
|
||||||
|
QList<PreviewCursor *> mList;
|
||||||
|
const PreviewCursor *mCurrent;
|
||||||
|
bool mNeedLayout;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,229 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 2014-04-10 modified by Hong Jen Yee (PCMan) for integration with lxqt-config-input
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "selectwnd.h"
|
||||||
|
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QToolTip>
|
||||||
|
|
||||||
|
#include "cfgfile.h"
|
||||||
|
#include "crtheme.h"
|
||||||
|
#include "thememodel.h"
|
||||||
|
#include "itemdelegate.h"
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrxcur.h"
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
#include <XdgIcon>
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
|
#define HOME_ICON_DIR QDir::homePath() + "/.icons"
|
||||||
|
|
||||||
|
SelectWnd::SelectWnd(LxQt::Settings* settings, QWidget *parent) : QWidget(parent), mSettings(settings)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
warningLabel->hide();
|
||||||
|
|
||||||
|
mModel = new XCursorThemeModel(this);
|
||||||
|
|
||||||
|
int size = style()->pixelMetric(QStyle::PM_LargeIconSize);
|
||||||
|
lbThemes->setModel(mModel);
|
||||||
|
lbThemes->setItemDelegate(new ItemDelegate(this));
|
||||||
|
lbThemes->setIconSize(QSize(size, size));
|
||||||
|
lbThemes->setSelectionMode(QAbstractItemView::SingleSelection);
|
||||||
|
|
||||||
|
// Make sure we find out about selection changes
|
||||||
|
connect(lbThemes->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),
|
||||||
|
SLOT(currentChanged(const QModelIndex &, const QModelIndex &)));
|
||||||
|
// display/hide warning label
|
||||||
|
connect(mModel, SIGNAL(modelReset()),
|
||||||
|
this, SLOT(handleWarning()));
|
||||||
|
connect(mModel, SIGNAL(rowsInserted(const QModelIndex&, int, int)),
|
||||||
|
this, SLOT(handleWarning()));
|
||||||
|
connect(mModel, SIGNAL(rowsRemoved(const QModelIndex&, int, int)),
|
||||||
|
this, SLOT(handleWarning()));
|
||||||
|
|
||||||
|
connect(warningLabel, SIGNAL(showDirInfo()),
|
||||||
|
this, SLOT(showDirInfo()));
|
||||||
|
|
||||||
|
// Disable the install button if we can't install new themes to ~/.icons,
|
||||||
|
// or Xcursor isn't set up to look for cursor themes there
|
||||||
|
btInstall->setEnabled(mModel->searchPaths().contains(HOME_ICON_DIR) && iconsIsWritable());
|
||||||
|
// TODO/FIXME: btInstall functionality
|
||||||
|
btInstall->hide();
|
||||||
|
btRemove->hide();
|
||||||
|
|
||||||
|
//QTimer::singleShot(0, this, SLOT(setCurrent()));
|
||||||
|
|
||||||
|
handleWarning();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SelectWnd::~SelectWnd()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::setCurrent()
|
||||||
|
{
|
||||||
|
lbThemes->selectionModel()->clear();
|
||||||
|
|
||||||
|
QString ct = getCurrentTheme();
|
||||||
|
mAppliedIndex = mModel->defaultIndex();
|
||||||
|
|
||||||
|
if (!ct.isEmpty()) mAppliedIndex = mModel->findIndex(ct);
|
||||||
|
else mAppliedIndex = mModel->defaultIndex();
|
||||||
|
|
||||||
|
if (mAppliedIndex.isValid())
|
||||||
|
{
|
||||||
|
const XCursorThemeData *theme = mModel->theme(mAppliedIndex);
|
||||||
|
// Select the current theme
|
||||||
|
selectRow(mAppliedIndex);
|
||||||
|
lbThemes->scrollTo(mAppliedIndex, QListView::PositionAtCenter);
|
||||||
|
// Update the preview widget as well
|
||||||
|
if (theme) preview->setTheme(*theme);// else preview->clearTheme();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SelectWnd::iconsIsWritable() const
|
||||||
|
{
|
||||||
|
const QFileInfo icons = QFileInfo(HOME_ICON_DIR);
|
||||||
|
const QFileInfo home = QFileInfo(QDir::homePath());
|
||||||
|
return ((icons.exists() && icons.isDir() && icons.isWritable()) || (!icons.exists() && home.isWritable()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void SelectWnd::keyPressEvent(QKeyEvent *e)
|
||||||
|
{
|
||||||
|
if (e->key() == Qt::Key_Escape) close();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
void SelectWnd::selectRow(int row) const
|
||||||
|
{
|
||||||
|
// Create a selection that stretches across all columns
|
||||||
|
QModelIndex from = mModel->index(row, 0);
|
||||||
|
QModelIndex to = mModel->index(row, mModel->columnCount()-1);
|
||||||
|
QItemSelection selection(from, to);
|
||||||
|
lbThemes->selectionModel()->select(selection, QItemSelectionModel::Select);
|
||||||
|
lbThemes->selectionModel()->setCurrentIndex(mAppliedIndex, QItemSelectionModel::NoUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
|
||||||
|
{
|
||||||
|
Q_UNUSED(previous)
|
||||||
|
if (current.isValid()) {
|
||||||
|
const XCursorThemeData *theme = mModel->theme(current);
|
||||||
|
if (theme) {
|
||||||
|
preview->setTheme(*theme);
|
||||||
|
btRemove->setEnabled(theme->isWritable());
|
||||||
|
} else {
|
||||||
|
preview->clearTheme();
|
||||||
|
}
|
||||||
|
|
||||||
|
// directly apply the current settings
|
||||||
|
applyCurrent();
|
||||||
|
} else {
|
||||||
|
preview->clearTheme();
|
||||||
|
}
|
||||||
|
//emit changed(mAppliedIndex != current);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::on_btInstall_clicked()
|
||||||
|
{
|
||||||
|
qDebug() << "'install' clicked";
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::applyCurrent()
|
||||||
|
{
|
||||||
|
//qDebug() << "'set' clicked";
|
||||||
|
const XCursorThemeData *theme = mModel->theme(lbThemes->currentIndex());
|
||||||
|
if (!theme) return;
|
||||||
|
applyTheme(*theme);
|
||||||
|
fixXDefaults(theme->name());
|
||||||
|
|
||||||
|
// call xrdb to merge the new settings in ~/.Xdefaults
|
||||||
|
// FIXME: need to check if we're running in X?
|
||||||
|
QProcess xrdb;
|
||||||
|
xrdb.start("xrdb -merge " + QDir::home().path() + "/.Xdefaults");
|
||||||
|
xrdb.waitForFinished();
|
||||||
|
|
||||||
|
// old razor-qt and lxqt versions use $XCURSOR_THEME environment variable
|
||||||
|
// for this, but it's less flexible and more problematic. Let's deprecate its use.
|
||||||
|
mSettings->beginGroup("Environment");
|
||||||
|
mSettings->remove("XCURSOR_THEME"); // ensure that we're not using XCURSOR_THEME
|
||||||
|
mSettings->endGroup();
|
||||||
|
// save to Mouse/cursor_theme instead
|
||||||
|
mSettings->beginGroup("Mouse");
|
||||||
|
mSettings->setValue("cursor_theme", theme->name());
|
||||||
|
mSettings->endGroup();
|
||||||
|
|
||||||
|
// The XCURSOR_THEME environment varialbe does not work sometimes.
|
||||||
|
// Besides, XDefaults values are not used by Qt.
|
||||||
|
// So, let's write the new theme name to ~/.icons/default/index.theme.
|
||||||
|
// This is the most reliable way.
|
||||||
|
// QSettings will encode the group name "Icon Theme" to "Icon%20Theme" and there is no way to turn it off.
|
||||||
|
// So let's not use it here. :-(
|
||||||
|
QString dirPath = HOME_ICON_DIR + "/default";
|
||||||
|
QDir().mkpath(dirPath); // ensure the existence of the ~/.icons/default dir
|
||||||
|
QFile indexTheme(dirPath + "/index.theme");
|
||||||
|
if(indexTheme.open(QIODevice::WriteOnly|QIODevice::Truncate))
|
||||||
|
{
|
||||||
|
QTextStream(&indexTheme) <<
|
||||||
|
"# Written by lxqt-config-appearance\n" <<
|
||||||
|
"[Icon Theme]\n" <<
|
||||||
|
"Name=Default\n" <<
|
||||||
|
"Comment=Default cursor theme\n" <<
|
||||||
|
"Inherits=" << theme->name() << "\n";
|
||||||
|
indexTheme.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::on_btRemove_clicked()
|
||||||
|
{
|
||||||
|
qDebug() << "'remove' clicked";
|
||||||
|
const XCursorThemeData *theme = mModel->theme(lbThemes->currentIndex());
|
||||||
|
if (!theme) return;
|
||||||
|
QString ct = getCurrentTheme();
|
||||||
|
if (ct == theme->name())
|
||||||
|
{
|
||||||
|
QMessageBox::warning(this, tr("XCurTheme error"),
|
||||||
|
tr("You can't remove active theme!"), QMessageBox::Ok, QMessageBox::Ok);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QDir d(theme->path());
|
||||||
|
preview->clearTheme();
|
||||||
|
mModel->removeTheme(lbThemes->currentIndex());
|
||||||
|
removeXCursorTheme(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::handleWarning()
|
||||||
|
{
|
||||||
|
bool empty = mModel->rowCount();
|
||||||
|
warningLabel->setVisible(!empty);
|
||||||
|
preview->setVisible(empty);
|
||||||
|
infoLabel->setVisible(empty);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SelectWnd::showDirInfo()
|
||||||
|
{
|
||||||
|
QToolTip::showText(mapToGlobal(warningLabel->buttonPos()), mModel->searchPaths().join("\n"));
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 2014-04-10 modified by Hong Jen Yee (PCMan) for integration with lxqt-config-input
|
||||||
|
|
||||||
|
#ifndef SELECTWND_H
|
||||||
|
#define SELECTWND_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
namespace LxQt {
|
||||||
|
class Settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
class XCursorThemeModel;
|
||||||
|
|
||||||
|
#include "ui_selectwnd.h"
|
||||||
|
class SelectWnd : public QWidget, private Ui_SelectWnd
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
SelectWnd (LxQt::Settings* settings, QWidget *parent=0);
|
||||||
|
~SelectWnd ();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setCurrent ();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// void keyPressEvent (QKeyEvent *e);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool iconsIsWritable () const;
|
||||||
|
void selectRow (int) const;
|
||||||
|
void selectRow (const QModelIndex &index) const { selectRow(index.row()); }
|
||||||
|
void applyCurrent ();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void currentChanged (const QModelIndex ¤t, const QModelIndex &previous);
|
||||||
|
void on_btInstall_clicked ();
|
||||||
|
void on_btRemove_clicked ();
|
||||||
|
void handleWarning();
|
||||||
|
void showDirInfo();
|
||||||
|
|
||||||
|
private:
|
||||||
|
XCursorThemeModel *mModel;
|
||||||
|
QPersistentModelIndex mAppliedIndex;
|
||||||
|
LxQt::Settings* mSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,328 @@
|
|||||||
|
/* Copyright © 2005-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "thememodel.h"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
|
||||||
|
#include "crtheme.h"
|
||||||
|
#include "cfgfile.h"
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
|
||||||
|
|
||||||
|
//#define DUMP_FOUND_THEMES
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorThemeModel::XCursorThemeModel (QObject *parent) : QAbstractTableModel(parent)
|
||||||
|
{
|
||||||
|
insertThemes();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorThemeModel::~XCursorThemeModel()
|
||||||
|
{
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QVariant XCursorThemeModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
// Only provide text for the headers
|
||||||
|
if (role != Qt::DisplayRole) return QVariant();
|
||||||
|
// Horizontal header labels
|
||||||
|
if (orientation == Qt::Horizontal)
|
||||||
|
{
|
||||||
|
switch (section)
|
||||||
|
{
|
||||||
|
case NameColumn: return tr("Name");
|
||||||
|
case DescColumn: return tr("Description");
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Numbered vertical header lables
|
||||||
|
return QString(section);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant XCursorThemeModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid() || index.row() < 0 || index.row() >= mList.count()) return QVariant();
|
||||||
|
const XCursorThemeData *theme = mList.at(index.row());
|
||||||
|
// Text label
|
||||||
|
if (role == Qt::DisplayRole)
|
||||||
|
{
|
||||||
|
switch (index.column())
|
||||||
|
{
|
||||||
|
case NameColumn: return theme->title();
|
||||||
|
case DescColumn: return theme->description();
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Description for the first name column
|
||||||
|
if (role == XCursorThemeData::DisplayDetailRole && index.column() == NameColumn) return theme->description();
|
||||||
|
// Icon for the name column
|
||||||
|
if (role == Qt::DecorationRole && index.column() == NameColumn) return theme->icon();
|
||||||
|
//
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCursorThemeModel::sort(int column, Qt::SortOrder order)
|
||||||
|
{
|
||||||
|
Q_UNUSED(column);
|
||||||
|
Q_UNUSED(order);
|
||||||
|
// Sorting of the model isn't implemented, as the KCM currently uses
|
||||||
|
// a sorting proxy model.
|
||||||
|
}
|
||||||
|
|
||||||
|
const XCursorThemeData *XCursorThemeModel::theme(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
if (!index.isValid()) return NULL;
|
||||||
|
if (index.row() < 0 || index.row() >= mList.count()) return NULL;
|
||||||
|
return mList.at(index.row());
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex XCursorThemeModel::findIndex(const QString &name)
|
||||||
|
{
|
||||||
|
uint hash = qHash(name);
|
||||||
|
for (int i = 0; i < mList.count(); ++i)
|
||||||
|
{
|
||||||
|
const XCursorThemeData *theme = mList.at(i);
|
||||||
|
if (theme->hash() == hash) return index(i, 0);
|
||||||
|
}
|
||||||
|
return QModelIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex XCursorThemeModel::defaultIndex()
|
||||||
|
{
|
||||||
|
return findIndex(mDefaultName);
|
||||||
|
}
|
||||||
|
|
||||||
|
const QStringList XCursorThemeModel::searchPaths()
|
||||||
|
{
|
||||||
|
if (!mBaseDirs.isEmpty()) return mBaseDirs;
|
||||||
|
// Get the search path from Xcursor
|
||||||
|
QString path = XcursorLibraryPath();
|
||||||
|
// Separate the paths
|
||||||
|
mBaseDirs = path.split(':', QString::SkipEmptyParts);
|
||||||
|
// Remove duplicates
|
||||||
|
QMutableStringListIterator i(mBaseDirs);
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
const QString path = i.next();
|
||||||
|
QMutableStringListIterator j(i);
|
||||||
|
while (j.hasNext()) if (j.next() == path) j.remove();
|
||||||
|
}
|
||||||
|
// Expand all occurrences of ~/ to the home dir
|
||||||
|
mBaseDirs.replaceInStrings(QRegExp("^~\\/"), QDir::home().path() + '/');
|
||||||
|
return mBaseDirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool XCursorThemeModel::hasTheme(const QString &name) const
|
||||||
|
{
|
||||||
|
const uint hash = qHash(name);
|
||||||
|
foreach (const XCursorThemeData *theme, mList) if (theme->hash() == hash) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool XCursorThemeModel::isCursorTheme(const QString &theme, const int depth)
|
||||||
|
{
|
||||||
|
// Prevent infinite recursion
|
||||||
|
if (depth > 10) return false;
|
||||||
|
// Search each icon theme directory for 'theme'
|
||||||
|
foreach (const QString &baseDir, searchPaths())
|
||||||
|
{
|
||||||
|
QDir dir(baseDir);
|
||||||
|
if (!dir.exists() || !dir.cd(theme)) continue;
|
||||||
|
// If there's a cursors subdir, we'll assume this is a cursor theme
|
||||||
|
if (dir.exists("cursors")) return true;
|
||||||
|
// If the theme doesn't have an index.theme file, it can't inherit any themes
|
||||||
|
if (!dir.exists("index.theme")) continue;
|
||||||
|
// Open the index.theme file, so we can get the list of inherited themes
|
||||||
|
QMultiMap<QString, QString> cfg = loadCfgFile(dir.path()+"/index.theme", true);
|
||||||
|
QStringList inherits = cfg.values("icon theme/inherits");
|
||||||
|
// Recurse through the list of inherited themes, to check if one of them is a cursor theme
|
||||||
|
// note that items are reversed
|
||||||
|
for (int f = inherits.size()-1; f >= 0; --f)
|
||||||
|
{
|
||||||
|
QString inh = inherits.at(f);
|
||||||
|
// Avoid possible DoS
|
||||||
|
if (inh == theme) continue;
|
||||||
|
if (isCursorTheme(inh, depth+1)) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool XCursorThemeModel::handleDefault(const QDir &themeDir)
|
||||||
|
{
|
||||||
|
QFileInfo info(themeDir.path());
|
||||||
|
// If "default" is a symlink
|
||||||
|
if (info.isSymLink())
|
||||||
|
{
|
||||||
|
QFileInfo target(info.symLinkTarget());
|
||||||
|
if (target.exists() && (target.isDir() || target.isSymLink())) mDefaultName = target.fileName();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// If there's no cursors subdir, or if it's empty
|
||||||
|
if (!themeDir.exists("cursors") ||
|
||||||
|
QDir(themeDir.path() + "/cursors").entryList(QDir::Files |
|
||||||
|
QDir::NoDotAndDotDot).isEmpty())
|
||||||
|
{
|
||||||
|
if (themeDir.exists("index.theme"))
|
||||||
|
{
|
||||||
|
XCursorThemeData theme(themeDir);
|
||||||
|
if (!theme.inherits().isEmpty()) mDefaultName = theme.inherits().at(0);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
mDefaultName = QLatin1String("default");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#define DUMP_FOUND_THEMES
|
||||||
|
void XCursorThemeModel::processThemeDir(const QDir &themeDir)
|
||||||
|
{
|
||||||
|
#ifdef DUMP_FOUND_THEMES
|
||||||
|
qDebug() << "looking at:" << themeDir.path();
|
||||||
|
#endif
|
||||||
|
bool haveCursors = themeDir.exists("cursors");
|
||||||
|
// Special case handling of "default", since it's usually either a
|
||||||
|
// symlink to another theme, or an empty theme that inherits another theme
|
||||||
|
if (mDefaultName.isNull() && themeDir.dirName() == "default")
|
||||||
|
{
|
||||||
|
if (handleDefault(themeDir)) return;
|
||||||
|
}
|
||||||
|
// If the directory doesn't have a cursors subdir and lacks an
|
||||||
|
// index.theme file it can't be a cursor theme.
|
||||||
|
if (!themeDir.exists("index.theme") && !haveCursors)
|
||||||
|
{
|
||||||
|
//qDebug() << "IS NOT THEME" << themeDir;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Create a cursor theme object for the theme dir
|
||||||
|
XCursorThemeData *theme = new XCursorThemeData(themeDir);
|
||||||
|
// Skip this theme if it's hidden
|
||||||
|
#ifdef DUMP_FOUND_THEMES
|
||||||
|
qDebug() <<
|
||||||
|
" theme name:" << theme->name() <<
|
||||||
|
"\n theme title:" << theme->title() <<
|
||||||
|
"\n theme desc:" << theme->description() <<
|
||||||
|
"\n theme sample:" << theme->sample() <<
|
||||||
|
"\n theme inherits:" << theme->inherits();
|
||||||
|
#endif
|
||||||
|
if (theme->isHidden())
|
||||||
|
{
|
||||||
|
//qDebug() << "HIDDEN THEME" << theme->name() << themeDir;
|
||||||
|
delete theme;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// If there's no cursors subdirectory we'll do a recursive scan
|
||||||
|
// to check if the theme inherits a theme with one
|
||||||
|
if (!haveCursors)
|
||||||
|
{
|
||||||
|
bool foundCursorTheme = false;
|
||||||
|
foreach (const QString &name, theme->inherits())
|
||||||
|
{
|
||||||
|
if ((foundCursorTheme = isCursorTheme(name))) break;
|
||||||
|
}
|
||||||
|
if (!foundCursorTheme)
|
||||||
|
{
|
||||||
|
delete theme;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Append the theme to the list
|
||||||
|
mList.append(theme);
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCursorThemeModel::insertThemes()
|
||||||
|
{
|
||||||
|
// Scan each base dir for Xcursor themes and add them to the list
|
||||||
|
foreach (const QString &baseDir, searchPaths())
|
||||||
|
{
|
||||||
|
QDir dir(baseDir);
|
||||||
|
//qDebug() << "TOPLEVEL" << baseDir;
|
||||||
|
if (!dir.exists()) continue;
|
||||||
|
//qDebug() << " continue passed";
|
||||||
|
// Process each subdir in the directory
|
||||||
|
foreach (const QString &name, dir.entryList(QDir::AllDirs |
|
||||||
|
QDir::NoDotAndDotDot | QDir::Readable | QDir::Executable))
|
||||||
|
{
|
||||||
|
//qDebug() << " SUBDIR" << name;
|
||||||
|
// Don't process the theme if a theme with the same name already exists
|
||||||
|
// in the list. Xcursor will pick the first one it finds in that case,
|
||||||
|
// and since we use the same search order, the one Xcursor picks should
|
||||||
|
// be the one already in the list
|
||||||
|
if (hasTheme(name))
|
||||||
|
{
|
||||||
|
qDebug() << "duplicate theme:" << dir.path()+name;
|
||||||
|
}
|
||||||
|
if (!dir.cd(name))
|
||||||
|
{
|
||||||
|
qDebug() << "can't cd:" << dir.path()+name;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
processThemeDir(dir);
|
||||||
|
dir.cdUp(); // Return to the base dir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The theme Xcursor will end up using if no theme is configured
|
||||||
|
//if (mDefaultName.isNull() || !hasTheme(mDefaultName)) mDefaultName = legacy->name();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool XCursorThemeModel::addTheme(const QDir &dir)
|
||||||
|
{
|
||||||
|
XCursorThemeData *theme = new XCursorThemeData(dir);
|
||||||
|
// Don't add the theme to the list if it's hidden
|
||||||
|
if (theme->isHidden())
|
||||||
|
{
|
||||||
|
delete theme;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// If an item with the same name already exists in the list,
|
||||||
|
// we'll remove it before inserting the new one.
|
||||||
|
for (int i = 0; i < mList.count(); ++i)
|
||||||
|
{
|
||||||
|
if (mList.at(i)->hash() == theme->hash())
|
||||||
|
{
|
||||||
|
removeTheme(index(i, 0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Append the theme to the list
|
||||||
|
beginInsertRows(QModelIndex(), rowCount(), rowCount());
|
||||||
|
mList.append(theme);
|
||||||
|
endInsertRows();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void XCursorThemeModel::removeTheme(const QModelIndex &index)
|
||||||
|
{
|
||||||
|
if (!index.isValid()) return;
|
||||||
|
beginRemoveRows(QModelIndex(), index.row(), index.row());
|
||||||
|
delete mList.takeAt(index.row());
|
||||||
|
endRemoveRows();
|
||||||
|
}
|
@ -0,0 +1,116 @@
|
|||||||
|
/* Copyright © 2005-2007 Fredrik Höglund <fredrik@kde.org>
|
||||||
|
* (c)GPL2 (c)GPL3
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public
|
||||||
|
* License version 2 or at your option version 3 as published
|
||||||
|
* by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* 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; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* additional code: Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
*/
|
||||||
|
#ifndef THEMEMODEL_H
|
||||||
|
#define THEMEMODEL_H
|
||||||
|
|
||||||
|
#include <QAbstractTableModel>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
class QDir;
|
||||||
|
class XCursorThemeData;
|
||||||
|
|
||||||
|
|
||||||
|
// The two TableView/TreeView columns provided by the model
|
||||||
|
enum Columns { NameColumn = 0, DescColumn };
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The XCursorThemeModel class provides a model for all locally installed
|
||||||
|
* Xcursor themes, and the KDE/Qt legacy bitmap theme.
|
||||||
|
*
|
||||||
|
* This class automatically scans the locations in the file system from
|
||||||
|
* which Xcursor loads cursors, and creates an internal list of all
|
||||||
|
* available cursor themes.
|
||||||
|
*
|
||||||
|
* The model provides this theme list to item views in the form of a list
|
||||||
|
* of rows with two columns; the first column has the theme's descriptive
|
||||||
|
* name and its sample cursor as its icon, and the second column contains
|
||||||
|
* the theme's description.
|
||||||
|
*
|
||||||
|
* Additional Xcursor themes can be added to a model after it's been
|
||||||
|
* created, by calling addTheme(), which takes QDir as a parameter,
|
||||||
|
* with the themes location. The intention is for this function to be
|
||||||
|
* called when a new Xcursor theme has been installed, after the model
|
||||||
|
* was instantiated.
|
||||||
|
*
|
||||||
|
* The KDE legacy theme is a read-only entry, with the descriptive name
|
||||||
|
* "KDE Classic", and the internal name "#kde_legacy#".
|
||||||
|
*
|
||||||
|
* Calling defaultIndex() will return the index of the theme Xcursor
|
||||||
|
* will use if the user hasn't explicitly configured a cursor theme.
|
||||||
|
*/
|
||||||
|
class XCursorThemeModel : public QAbstractTableModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
XCursorThemeModel (QObject *parent = 0);
|
||||||
|
~XCursorThemeModel ();
|
||||||
|
|
||||||
|
inline int columnCount (const QModelIndex &parent = QModelIndex()) const;
|
||||||
|
inline int rowCount (const QModelIndex &parent = QModelIndex()) const;
|
||||||
|
QVariant headerData (int section, Qt::Orientation orientation, int role) const;
|
||||||
|
QVariant data (const QModelIndex &index, int role) const;
|
||||||
|
void sort (int column, Qt::SortOrder order = Qt::AscendingOrder);
|
||||||
|
|
||||||
|
/// Returns the CursorTheme at @p index.
|
||||||
|
const XCursorThemeData *theme (const QModelIndex &index);
|
||||||
|
|
||||||
|
/// Returns the index for the CursorTheme with the internal name @p name,
|
||||||
|
/// or an invalid index if no matching theme can be found.
|
||||||
|
QModelIndex findIndex (const QString &name);
|
||||||
|
|
||||||
|
/// Returns the index for the default theme.
|
||||||
|
QModelIndex defaultIndex ();
|
||||||
|
|
||||||
|
/// Adds the theme in @p dir, and returns @a true if successful or @a false otherwise.
|
||||||
|
bool addTheme (const QDir &dir);
|
||||||
|
void removeTheme (const QModelIndex &index);
|
||||||
|
|
||||||
|
/// Returns the list of base dirs Xcursor looks for themes in.
|
||||||
|
const QStringList searchPaths ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool handleDefault (const QDir &dir);
|
||||||
|
void processThemeDir (const QDir &dir);
|
||||||
|
void insertThemes ();
|
||||||
|
bool hasTheme (const QString &theme) const;
|
||||||
|
bool isCursorTheme (const QString &theme, const int depth = 0);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QList<XCursorThemeData *>mList;
|
||||||
|
QStringList mBaseDirs;
|
||||||
|
QString mDefaultName;
|
||||||
|
};
|
||||||
|
|
||||||
|
int XCursorThemeModel::rowCount (const QModelIndex &) const
|
||||||
|
{
|
||||||
|
return mList.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int XCursorThemeModel::columnCount (const QModelIndex &) const
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="en_US">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="cs">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Nastavení motivu myši</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Vyberte motiv ukazovátka, jejž chcete používat (přejeďte myší nad náhledem kvůli vyzkoušení ukazovátka). <b>Sezení LXQt je potřeba po této změně spustit znovu</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>Na&instalovat nový motiv...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Nastavit motiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Odstranit motiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Zavřít</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Chyba XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Nemůžete odstranit právě nastavený motiv</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Název</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Popis</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="cs_CZ">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Nastavení motivu myši</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Vyberte motiv ukazovátka, jejž chcete používat (přejeďte myší nad náhledem kvůli vyzkoušení ukazovátka). <b>Sezení LXQt je potřeba po této změně spustit znovu</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>Na&instalovat nový motiv...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Nastavit motiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Odstranit motiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Zavřít</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Chyba XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Nemůžete odstranit právě nastavený motiv</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Název</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Popis</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="da_DK">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQt Musemarkør Tema Indstillinger</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Vælg det markør tema, du vil bruge (forhåndsvisning for at teste markør).
|
||||||
|
<b> LXQt session skal genstartes efter denne ændring </ b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Installer Nyt Tema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Sæt Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Fjern Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Afslut</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme fejl</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Det aktive tema kan ikke fjernes!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Navn</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Beskrivelse</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.0" language="de">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQt Mauszeigerdesign Konfiguration</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Wähle das gewünschte Mauszeigerdesign aus (zum Test Maus über Vorschau bewegen)
|
||||||
|
<b>Die LXQt-Sitzung muss nach dieser Veränderung neu gestartet werden</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Neues Design installieren...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation>&Design festlegen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>D&esign entfernen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation>&Schließen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XcurTheme Fehler</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Das aktive Design kann nicht entfernt werden!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation>Dialogfenster</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation>LXQt konnte kein Mauszeigerdesign finden. Stattdessen wird das Default-Mauszeigerdesign von X11 verwendet. LXQt suchte in folgenden Verzeichnissen:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation>Anzeigen...</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Name</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Beschreibung</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="eo">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Agordoj de etosoj de muso de LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Elektu la etoson de kursoro, kiun vi volas uzi (ŝveba antaŭrigardo por testi kursoron). <b>Seanco de LXQt postulas restartigon post ol ĉi tiu ŝanĝo</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instali novan etoson...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">Agordi eto&son</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>Fo&rigi etoson</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Fermi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Eraro de XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Vi ne povas forigi aktivan etoson!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nomo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Priskribo</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="es">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Configuración de LXQt para el Tema del Ratón</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Seleccione el tema del cursor que desea utilizar (pase el cursor para una vista previa). <b>LXQt necesita reiniciar la sesión después de este cambio </ b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalar Nuevo Tema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Establecer Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Quitar Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Cerrar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Error en XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>¡No puedes quitar el tema activo!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nombre</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descripción</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="es_VE">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Configuracion de tema de raton de LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Selecciona el cursor del raton que tu desees usar (colocalo encima para ver una previsualizacion) <b>La sesion de LXQt necesita reinicializarse despues de un cambio</b></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalar nuevo tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">A&Signar el tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Remover el tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Cerrar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme error</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>No puedes remover el tema activo!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nombre</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descripcion</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="eu">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQt saguaren gaiaren konfigurazioa</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Hautatu erabili nahi duzun kurtsore-gaia (nabarmendu aurrebista kurtsorea probatzeko). <b>LXQt saioa berrabiarazi behar da aldaketa honen ondoren</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalatu gai berria...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Ezarri gaia</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Kendu gaia</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Itxi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme errorea</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Ezin duzu gai aktiboa kendu!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Izena</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Deskribapena</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="fi">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQtin hiiriteeman asetukset</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Valitse haluamasi osoitinteema (käytä esikatselua testataksesi osoitinteemaa). <b>LXQt-istunto tulee käynnistää uudelleen tämän muutoksen jälkeen</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Asenna uusi teema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">Aseta &teema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Poista teema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Sulje</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme-virhe</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Käytössä olevaa teemaa ei voi poistaa!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nimi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Kuvaus</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="fr_FR">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Fermer</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="hu_HU">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Bezárás</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="it_IT">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Configurazione del tema del mouse di LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Seleziona il tema del cursore che vuoi utilizzare (passa sull'anteprima per provare il cursore).
|
||||||
|
<b>La sessione di LXQt deve essere riavviata dopo questa modifica</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Installa un nuovo tema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Imposta il tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Rimuovi il tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Chiudi</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Errore XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Non puoi rimuovere il tema attivo!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nome</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descrizione</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="ja">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQtマウステーマの設定</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>使いたいカーソルテーマを選択 (プレビューをテストカーソルに合わせます). <b>LXQtセッションはこの変更後に再起動が必要です</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>新しいテーマのインストール...(&I)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>テーマの削除(&R)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme エラー</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>アクティブなテーマは削除できません!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation>フォーム</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation>カーソルテーマを見つけられませんでした。代わりに、デフォルトのX11カーソルテーマが使われます。LXQtは以下のディレクトリーを検索しました:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation>表示</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>名称</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>説明</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="lt">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Užverti</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="nl">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Sluiten</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="pl_PL">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Wygląd kursora</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Wybierz motyw kursora ( najedz kursorem na podgląd by przetestować): <b>
|
||||||
|
Wymagane jest ponowne uruchomienie sesji </b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Zainstaluj Nowe Motywy</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Wybierz Motyw</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Usuń Motyw</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Zamknij</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Błąd XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Nie możesz usunąć aktywnego motywu</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nazwa</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Opis</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="pt">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Definições do tema de cursor do LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Escolha o tema de cursor a utilizar (passe com o rato para testar). <b>Tem que reiniciar o LXQt a sessão após a alteração</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalar novo tema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Definir tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Remover tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">Fe&char</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Erro XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Não pode remover o tema ativo!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation>Formulário</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation>O LxQt não encontrou quaisquer temas de cursor. Será utilizado o tema de cursor X11. O LxQt procurou nestes diretórios:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation>Mostrar...</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nome</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descrição</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="pt_BR">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Configuração Do Tema Do Mouse</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Selecione o tema do cursor que você deseja usar (pairar visualização para testar o cursor). <b>A sessão LXQt precisa reiniciar após esta mudança</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalar Novo Tema...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Definir Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&Remover Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Fechar</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Erro XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Você não pode remover o tema ativo!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nome</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descrição</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="ro_RO">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>Configurare temă maus LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>Selectați tema de cursor pe care doriți să o utilizați (treceți peste cu mausul pentru a testa cursorul)</b>Sesiunea LXQt necesită o repornire după această modificare</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>&Instalează temă nouă...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&Setează tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>Elimină tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">În&chide</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>Eroare XCurTheme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>Nu se poate elimina tema activă!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>Nume</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>Descriere</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="sl">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Zapri</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,76 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="th_TH">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>การตั้งค่าชุดตกแต่งเมาส์ LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>เลือกชุดตกแต่งเคอร์เซอร์ที่คุณต้องการจะใช้ (วางเคอร์เซอร์ไว้บนตัวอย่างเพื่อทดสอบมัน). <b>วาระงาน LXQt จำเป็นต้องเริ่มใหม่หลังการเปลี่ยนแปลงนี้</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>ติดตั้งชุด&ตกแต่ง...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">&ใช้เป็นชุดตกแต่ง</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>&ลบชุดตกแต่ง</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">ปิ&ด</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme ขัดข้อง</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>คุณไม่สามารถลบชุดตกแต่งที่กำลังใช้งานอยู่ได้</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>ชื่อ</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>รายละเอียด</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,72 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="tr">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">&Kapat</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,77 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="zh_TW">
|
||||||
|
<context>
|
||||||
|
<name>SelectWnd</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="14"/>
|
||||||
|
<source>LXQt Mouse Theme Configuration</source>
|
||||||
|
<translation>LXQt滑鼠游標主題設定</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="20"/>
|
||||||
|
<source>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</source>
|
||||||
|
<translation>選擇您喜歡的游標主題 (檢視來回移動來測試游標) 。
|
||||||
|
<b>套用改變需要重新啟動LXQt會話</b>:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="81"/>
|
||||||
|
<source>&Install New Theme...</source>
|
||||||
|
<translation>安裝新主題...(&I)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Set Theme</source>
|
||||||
|
<translation type="vanished">設為主題(&S)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/selectwnd.ui" line="88"/>
|
||||||
|
<source>&Remove Theme</source>
|
||||||
|
<translation>移除主題(&R)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Close</source>
|
||||||
|
<translation type="vanished">關閉(&C)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="208"/>
|
||||||
|
<source>XCurTheme error</source>
|
||||||
|
<translation>XCurTheme錯誤</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../selectwnd.cpp" line="209"/>
|
||||||
|
<source>You can't remove active theme!</source>
|
||||||
|
<translation>您無法移除正在套用的主題!</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>WarningLabel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="14"/>
|
||||||
|
<source>Form</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="44"/>
|
||||||
|
<source>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../ui/warninglabel.ui" line="54"/>
|
||||||
|
<source>Show...</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>XCursorThemeModel</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="61"/>
|
||||||
|
<source>Name</source>
|
||||||
|
<translation>名稱</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../thememodel.cpp" line="62"/>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation>描述</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,114 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>SelectWnd</class>
|
||||||
|
<widget class="QWidget" name="SelectWnd">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>384</width>
|
||||||
|
<height>353</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>LXQt Mouse Theme Configuration</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0" colspan="4">
|
||||||
|
<widget class="QLabel" name="infoLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Select the cursor theme you want to use (hover preview to test cursor). <b>LXQt session needs restart after this change</b>:</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="4">
|
||||||
|
<widget class="WarningLabel" name="warningLabel" native="true"/>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="4">
|
||||||
|
<widget class="PreviewWidget" name="preview" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>48</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="4">
|
||||||
|
<widget class="QListView" name="lbThemes">
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
|
<property name="showDropIndicator" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="verticalScrollMode">
|
||||||
|
<enum>QAbstractItemView::ScrollPerPixel</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<spacer>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>174</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QPushButton" name="btInstall">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Install New Theme...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="2">
|
||||||
|
<widget class="QPushButton" name="btRemove">
|
||||||
|
<property name="text">
|
||||||
|
<string>&Remove Theme</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>PreviewWidget</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>previewwidget.h</header>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>WarningLabel</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>warninglabel.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>lbThemes</tabstop>
|
||||||
|
<tabstop>btInstall</tabstop>
|
||||||
|
<tabstop>btRemove</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -0,0 +1,64 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>WarningLabel</class>
|
||||||
|
<widget class="QWidget" name="WarningLabel">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>334</width>
|
||||||
|
<height>72</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="iconLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>64</width>
|
||||||
|
<height>64</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="warningLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>LXQt could not find any cursor theme. The default X11 cursor theme will be used instead. LXQt looked in the following directories:</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="showDirButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Show...</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -0,0 +1,43 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Petr Vanek <petr@scribus.info>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include <XdgIcon>
|
||||||
|
|
||||||
|
#include "warninglabel.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
WarningLabel::WarningLabel(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
iconLabel->setPixmap(XdgIcon::fromTheme("dialog-warning").pixmap(64, 64));
|
||||||
|
|
||||||
|
connect(showDirButton, SIGNAL(pressed()),
|
||||||
|
this, SIGNAL(showDirInfo()));
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Petr Vanek <petr@scribus.info>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef WARNINGLABEL_H
|
||||||
|
#define WARNINGLABEL_H
|
||||||
|
|
||||||
|
#include "ui_warninglabel.h"
|
||||||
|
|
||||||
|
|
||||||
|
class WarningLabel : public QWidget, public Ui::WarningLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
WarningLabel (QWidget *parent=0);
|
||||||
|
|
||||||
|
QPoint buttonPos() { return showDirButton->pos(); }
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void showDirInfo();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,262 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QPaintEngine>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QStyle>
|
||||||
|
#include <QTextCodec>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include <QX11Info>
|
||||||
|
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
|
|
||||||
|
inline static quint8 alphaPreMul (quint8 clr, quint8 alpha) {
|
||||||
|
quint32 c32 = clr, a32 = alpha;
|
||||||
|
c32 = c32*a32/255;
|
||||||
|
if (c32 > a32) c32 = a32;
|
||||||
|
return c32&0xff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int nominalCursorSize (int iconSize) {
|
||||||
|
for (int i = 512; i > 8; i /= 2) {
|
||||||
|
if (i < iconSize) return i;
|
||||||
|
if (int(i*0.75) < iconSize) return int(i*0.75);
|
||||||
|
}
|
||||||
|
return 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void baPutDW (QByteArray &ba, quint32 v) {
|
||||||
|
ba.append('\0'); ba.append('\0');
|
||||||
|
ba.append('\0'); ba.append('\0');
|
||||||
|
uchar *d = (uchar *)ba.data();
|
||||||
|
d += ba.size()-4;
|
||||||
|
for (int f = 4; f > 0; f--, d++) {
|
||||||
|
*d = (v&0xff);
|
||||||
|
v >>= 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorImage::convertARGB2PreMul (QImage &img) {
|
||||||
|
switch (img.format()) {
|
||||||
|
case QImage::Format_ARGB32_Premultiplied: return;
|
||||||
|
case QImage::Format_ARGB32: break;
|
||||||
|
default: img.convertToFormat(QImage::Format_ARGB32/*_Premultiplied*/);
|
||||||
|
}
|
||||||
|
img.convertToFormat(QImage::Format_ARGB32_Premultiplied); // this shouldn't convert anything
|
||||||
|
// so convert it!
|
||||||
|
for (int y = img.height()-1; y >= 0; y--) {
|
||||||
|
quint8 *line = (quint8 *)img.scanLine(y);
|
||||||
|
for (int x = 0; x < img.width(); x++, line += 4) {
|
||||||
|
// convert to 'premultiplied'
|
||||||
|
line[0] = alphaPreMul(line[0], line[3]);
|
||||||
|
line[1] = alphaPreMul(line[1], line[3]);
|
||||||
|
line[2] = alphaPreMul(line[2], line[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorImage::XCursorImage (const QString &aName, const QImage &aImg, int aXHot, int aYHot, quint32 aDelay, quint32 aCSize) :
|
||||||
|
mIsValid(true), mName(aName), mImage(0), mDelay(aDelay), mXHot(aXHot), mYHot(aYHot), mCSize(aCSize)
|
||||||
|
{
|
||||||
|
mImage = new QImage(aImg.copy());
|
||||||
|
convertARGB2PreMul(*mImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorImage::XCursorImage (const QString &aName) :
|
||||||
|
mIsValid(false), mName(aName), mImage(0), mDelay(50), mXHot(0), mYHot(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorImage::~XCursorImage () {
|
||||||
|
delete mImage; // or memory will leak!
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QPixmap XCursorImage::icon () const {
|
||||||
|
if (mIcon.isNull()) mIcon = createIcon();
|
||||||
|
return mIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QCursor XCursorImage::cursor () const {
|
||||||
|
return QCursor(icon(), mXHot, mYHot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QImage XCursorImage::image (int size) const {
|
||||||
|
if (size == -1) size = XcursorGetDefaultSize(QX11Info::display());
|
||||||
|
if (!mImage) return QImage();
|
||||||
|
return mImage->copy();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QPixmap XCursorImage::createIcon () const {
|
||||||
|
QPixmap pixmap;
|
||||||
|
int iconSize = QApplication::style()->pixelMetric(QStyle::PM_LargeIconSize);
|
||||||
|
int cursorSize = nominalCursorSize(iconSize);
|
||||||
|
QSize size = QSize(iconSize, iconSize);
|
||||||
|
QImage img = image(cursorSize);
|
||||||
|
if (!img.isNull()) {
|
||||||
|
// Scale the image if it's larger than the preferred icon size
|
||||||
|
if (img.width() > size.width() || img.height() > size.height())
|
||||||
|
img = img.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
pixmap = QPixmap::fromImage(img);
|
||||||
|
}
|
||||||
|
return pixmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
quint32 XCursorImage::xcurSize () const {
|
||||||
|
if (!mImage || !mIsValid) return 0;
|
||||||
|
quint32 res = 9*4; // header
|
||||||
|
res += mImage->width()*mImage->height()*4;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorImage::genXCursorImg (QByteArray &res) const {
|
||||||
|
if (!mImage || !mIsValid) return;
|
||||||
|
baPutDW(res, 36); // header size
|
||||||
|
baPutDW(res, 0xfffd0002); // chunk type
|
||||||
|
baPutDW(res, mCSize); // subtype
|
||||||
|
baPutDW(res, 1); // version
|
||||||
|
baPutDW(res, (quint32)mImage->width());
|
||||||
|
baPutDW(res, (quint32)mImage->height());
|
||||||
|
baPutDW(res, (quint32)mXHot);
|
||||||
|
baPutDW(res, (quint32)mYHot);
|
||||||
|
baPutDW(res, (quint32)mDelay);
|
||||||
|
// now put the pixels
|
||||||
|
QImage i = mImage->copy();
|
||||||
|
i.convertToFormat(QImage::Format_ARGB32_Premultiplied);
|
||||||
|
//i.convertToFormat(QImage::Format_ARGB32);
|
||||||
|
for (int y = 0; y < i.height(); y++) {
|
||||||
|
const uchar *sl = i.scanLine(y);
|
||||||
|
const quint32 *d = (const quint32 *)sl;
|
||||||
|
for (int x = 0; x < i.width(); x++, d++) baPutDW(res, *d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorImages::XCursorImages (const QString &aName, const QString &aPath) :
|
||||||
|
mName(aName), mPath(aPath), mTitle(""), mAuthor(""), mLicense(""),
|
||||||
|
mEMail(""), mSite(""), mDescr(""), mIM("")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorImages::~XCursorImages () {
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QByteArray XCursorImages::genXCursor () const {
|
||||||
|
QByteArray res;
|
||||||
|
// build 'credits' block
|
||||||
|
QByteArray crdBA[7];
|
||||||
|
{
|
||||||
|
QStringList crb;
|
||||||
|
crb << mAuthor << mLicense << mDescr << mTitle << mEMail << mSite << mIM;
|
||||||
|
for (int f = 0; f < crb.size(); f++) {
|
||||||
|
QString s(crb[f]);
|
||||||
|
if (s.isEmpty()) crdBA[f].clear(); else crdBA[f] = s.toUtf8();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
res.append("Xcur"); // signature
|
||||||
|
baPutDW(res, 16); // header size
|
||||||
|
baPutDW(res, 65536); // version number
|
||||||
|
// TOC
|
||||||
|
quint32 cnt = 0;
|
||||||
|
foreach (const XCursorImage *i, mList) if (i->xcurSize() > 0) cnt++;
|
||||||
|
// 'credits'
|
||||||
|
for (int f = 0; f < 7; f++) if (!crdBA[f].isEmpty()) cnt++;
|
||||||
|
//
|
||||||
|
baPutDW(res, cnt); // # of chunks
|
||||||
|
if (!cnt) return res;
|
||||||
|
quint32 dataOfs = cnt*(3*4)+16;
|
||||||
|
// add 'credits' chunks
|
||||||
|
for (int f = 0; f < 7; f++) {
|
||||||
|
if (crdBA[f].isEmpty()) continue;
|
||||||
|
baPutDW(res, 0xfffd0001); // entry type
|
||||||
|
baPutDW(res, f+1); // subtype
|
||||||
|
baPutDW(res, dataOfs); // offset
|
||||||
|
dataOfs += crdBA[f].size()+20;
|
||||||
|
}
|
||||||
|
// add image chunks
|
||||||
|
foreach (const XCursorImage *i, mList) {
|
||||||
|
quint32 isz = i->xcurSize();
|
||||||
|
if (!isz) continue;
|
||||||
|
baPutDW(res, 0xfffd0002); // entry type
|
||||||
|
baPutDW(res, i->csize()); // subtype
|
||||||
|
baPutDW(res, dataOfs); // offset
|
||||||
|
dataOfs += isz;
|
||||||
|
}
|
||||||
|
// credits
|
||||||
|
for (int f = 0; f < 7; f++) {
|
||||||
|
if (crdBA[f].isEmpty()) continue;
|
||||||
|
baPutDW(res, 20); // header size
|
||||||
|
baPutDW(res, 0xfffd0001); // entry type
|
||||||
|
baPutDW(res, f+1); // subtype
|
||||||
|
baPutDW(res, 1); // version
|
||||||
|
baPutDW(res, crdBA[f].size()); // length
|
||||||
|
res.append(crdBA[f]);
|
||||||
|
}
|
||||||
|
// images
|
||||||
|
foreach (const XCursorImage *i, mList) {
|
||||||
|
quint32 isz = i->xcurSize();
|
||||||
|
if (!isz) continue;
|
||||||
|
i->genXCursorImg(res);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QImage XCursorImages::buildImage () const {
|
||||||
|
int width = 0, height = 0, cnt = 0;
|
||||||
|
foreach (const XCursorImage *i, mList) {
|
||||||
|
if (i->xcurSize() > 0) {
|
||||||
|
QImage img = i->image();
|
||||||
|
width = qMax(width, img.width());
|
||||||
|
height = qMax(height, img.height());
|
||||||
|
++cnt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//qDebug() << cnt << "images; size" << width << "by" << height;
|
||||||
|
|
||||||
|
QImage res(width*cnt, height, QImage::Format_ARGB32);
|
||||||
|
QPainter p(&res);
|
||||||
|
int x = 0;
|
||||||
|
foreach (const XCursorImage *i, mList) {
|
||||||
|
if (i->xcurSize() > 0) {
|
||||||
|
QImage img = i->image();
|
||||||
|
p.drawImage(QPoint(x, 0), img);
|
||||||
|
x += img.width();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
@ -0,0 +1,116 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef XCRIMG_H
|
||||||
|
#define XCRIMG_H
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorImage {
|
||||||
|
public:
|
||||||
|
XCursorImage (const QString &aName, const QImage &aImg, int aXHot=0, int aYHot=0, quint32 aDelay=50, quint32 aCSize=1);
|
||||||
|
XCursorImage (const QString &aName);
|
||||||
|
virtual ~XCursorImage ();
|
||||||
|
|
||||||
|
inline bool isValid () const { return mIsValid; }
|
||||||
|
inline const QString &name () const { return mName; }
|
||||||
|
inline quint32 delay () const { return mDelay; }
|
||||||
|
inline int xhot () const { return mXHot; }
|
||||||
|
inline int yhot () const { return mYHot; }
|
||||||
|
inline quint32 csize () const { return mCSize; }
|
||||||
|
|
||||||
|
inline void setXHot (int v) { mXHot = v; }
|
||||||
|
inline void setYHot (int v) { mYHot = v; }
|
||||||
|
inline void setDelay (quint32 v) { mDelay = v; }
|
||||||
|
inline void setName (const QString &n) { mName = n; }
|
||||||
|
inline void setCSize (quint32 v) { mCSize = v; }
|
||||||
|
|
||||||
|
virtual QPixmap icon () const;
|
||||||
|
virtual QCursor cursor () const;
|
||||||
|
virtual QImage image (int size=-1) const;
|
||||||
|
|
||||||
|
quint32 xcurSize () const; // size in bytes
|
||||||
|
|
||||||
|
virtual void genXCursorImg (QByteArray &res) const; // generate Xcursor image
|
||||||
|
|
||||||
|
static void convertARGB2PreMul (QImage &img);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual QPixmap createIcon () const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool mIsValid;
|
||||||
|
QString mName;
|
||||||
|
QImage *mImage;
|
||||||
|
quint32 mDelay; // milliseconds
|
||||||
|
int mXHot;
|
||||||
|
int mYHot;
|
||||||
|
quint32 mCSize;
|
||||||
|
mutable QPixmap mIcon;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorImages {
|
||||||
|
public:
|
||||||
|
XCursorImages (const QString &aName, const QString &aPath="");
|
||||||
|
virtual ~XCursorImages ();
|
||||||
|
|
||||||
|
inline const QString &name () const { return mName; }
|
||||||
|
inline const QString &path () const { return mPath; }
|
||||||
|
inline const QString &title () const { return mTitle; }
|
||||||
|
inline const QString &author () const { return mAuthor; }
|
||||||
|
inline const QString &license () const { return mLicense; }
|
||||||
|
inline const QString &mail () const { return mEMail; }
|
||||||
|
inline const QString &site () const { return mSite; }
|
||||||
|
inline const QString &descr () const { return mDescr; }
|
||||||
|
inline const QString &im () const { return mIM; }
|
||||||
|
inline const QString &script () const { return mScript; }
|
||||||
|
|
||||||
|
inline void setName (const QString &v) { mName = v; }
|
||||||
|
inline void setPath (const QString &v) { mPath = v; }
|
||||||
|
inline void setTitle (const QString &v) { mTitle = v; }
|
||||||
|
inline void setAuthor (const QString &v) { mAuthor = v; }
|
||||||
|
inline void setLicense (const QString &v) { mLicense = v; }
|
||||||
|
inline void setMail (const QString &v) { mEMail = v; }
|
||||||
|
inline void setSite (const QString &v) { mSite = v; }
|
||||||
|
inline void setDescr (const QString &v) { mDescr = v; }
|
||||||
|
inline void setIM (const QString &v) { mIM = v; }
|
||||||
|
inline void setScript (const QString &v) { mScript = v; }
|
||||||
|
|
||||||
|
inline const QList<XCursorImage *> &list () const { return mList; }
|
||||||
|
inline XCursorImage *item (int idx) { return mList.at(idx); }
|
||||||
|
inline const XCursorImage *at (int idx) const { return mList.at(idx); }
|
||||||
|
inline int count () const { return mList.size(); }
|
||||||
|
inline int size () const { return mList.size(); }
|
||||||
|
|
||||||
|
inline void append (XCursorImage *img) { mList << img; }
|
||||||
|
|
||||||
|
QByteArray genXCursor () const; // generate Xcursor file
|
||||||
|
|
||||||
|
QImage buildImage () const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString mName;
|
||||||
|
QString mPath;
|
||||||
|
QString mTitle;
|
||||||
|
QString mAuthor;
|
||||||
|
QString mLicense;
|
||||||
|
QString mEMail;
|
||||||
|
QString mSite;
|
||||||
|
QString mDescr;
|
||||||
|
QString mIM;
|
||||||
|
QString mScript; // just for writing it back
|
||||||
|
QList<XCursorImage *> mList;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,742 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
//#include <QtCore>
|
||||||
|
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrxcur.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
0 standard arrow
|
||||||
|
1 help arrow (the one with '?')
|
||||||
|
2 working arrow
|
||||||
|
3 busy cursor
|
||||||
|
4 precision select
|
||||||
|
5 text select
|
||||||
|
6 handwriting
|
||||||
|
7 unavailable
|
||||||
|
8 north (vert) resize
|
||||||
|
9 south resize
|
||||||
|
10 west (vert-means horiz???) resize
|
||||||
|
11 east resize
|
||||||
|
12 north-west resize
|
||||||
|
13 south-east resize
|
||||||
|
14 north-east resize
|
||||||
|
15 south-west resize
|
||||||
|
16 move
|
||||||
|
17 alternate select
|
||||||
|
18 hand
|
||||||
|
19 button
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static const char *nameTransTbl[] = {
|
||||||
|
// curFX idx, curXP name, [...altnames], finalname, 0
|
||||||
|
// end with 0
|
||||||
|
"", // standard arrow (it's \x00)
|
||||||
|
"Arrow",
|
||||||
|
"left_ptr", "X_cursor", "right_ptr", "top_left_arrow", "move",
|
||||||
|
"4498f0e0c1937ffe01fd06f973665830",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x04", // precision select
|
||||||
|
"Cross",
|
||||||
|
"tcross", "cross", "crosshair", "cross_reverse",
|
||||||
|
"draped_box",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x12", // hand
|
||||||
|
"Hand",
|
||||||
|
"hand", "hand1", "hand2", "9d800788f1b08800ae810202380a0822",
|
||||||
|
"e29285e634086352946a0e7090d73106",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x05", // text select
|
||||||
|
"IBeam",
|
||||||
|
"xterm",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x11", // alternate select
|
||||||
|
"UpArrow",
|
||||||
|
"center_ptr",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x0c",
|
||||||
|
"SizeNWSE", // north-west resize
|
||||||
|
"bottom_right_corner", "top_left_corner", "bd_double_arrow", "lr_angle",
|
||||||
|
"c7088f0f3e6c8088236ef8e1e3e70000",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x0e", // north-east resize
|
||||||
|
"SizeNESW",
|
||||||
|
"bottom_left_corner", "top_right_corner", "fd_double_arrow", "ll_angle",
|
||||||
|
"fcf1c3c7cd4491d801f1e1c78f100000",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x0a", // west resize
|
||||||
|
"SizeWE",
|
||||||
|
"sb_h_double_arrow", "left_side", "right_side", "h_double_arrow", "028006030e0e7ebffc7f7070c0600140",
|
||||||
|
"14fef782d02440884392942c11205230",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x08", // north resize
|
||||||
|
"SizeNS",
|
||||||
|
"double_arrow", "bottom_side", "top_side", "v_double_arrow", "sb_v_double_arrow", "00008160000006810000408080010102",
|
||||||
|
"2870a09082c103050810ffdffffe0204",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x01", // help arrow
|
||||||
|
"Help",
|
||||||
|
"question_arrow",
|
||||||
|
"d9ce0ab605698f320427677b458ad60b",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x06", // handwriting
|
||||||
|
"Handwriting",
|
||||||
|
"pencil",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x02", // working arrow
|
||||||
|
"AppStarting",
|
||||||
|
"left_ptr_watch", "08e8e1c95fe2fc01f976f1e063a24ccd",
|
||||||
|
"3ecb610c1bf2410f44200f48c40d3599",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x10", // move (???)
|
||||||
|
"SizeAll",
|
||||||
|
"fleur",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x03", // busy cursor
|
||||||
|
"Wait",
|
||||||
|
"watch",
|
||||||
|
0,
|
||||||
|
//
|
||||||
|
"\x07", // unavailable
|
||||||
|
"NO",
|
||||||
|
"crossed_circle",
|
||||||
|
"03b6e0fcb3499374a867c041f52298f0",
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
static QString convertFXIndexToXPName (qint32 idx) {
|
||||||
|
int f = 0;
|
||||||
|
do {
|
||||||
|
if (nameTransTbl[f][0] == idx) return QString(nameTransTbl[f+1]);
|
||||||
|
f += 2;
|
||||||
|
while (nameTransTbl[f]) ++f;
|
||||||
|
++f;
|
||||||
|
} while (nameTransTbl[f]);
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static void removeFilesAndDirs (QDir &dir) {
|
||||||
|
//qDebug() << "dir:" << dir.path();
|
||||||
|
// files
|
||||||
|
QFileInfoList lst = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
//qDebug() << "removing" << fi.fileName() << fi.absoluteFilePath();
|
||||||
|
dir.remove(fi.fileName());
|
||||||
|
}
|
||||||
|
// dirs
|
||||||
|
lst = dir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
dir.cd(fi.fileName());
|
||||||
|
removeFilesAndDirs(dir);
|
||||||
|
dir.cd("..");
|
||||||
|
//qDebug() << "removing dir" << fi.fileName();
|
||||||
|
dir.rmdir(fi.fileName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void removeFiles (QDir &dir) {
|
||||||
|
//
|
||||||
|
QFileInfoList lst = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
qDebug() << "removing" << fi.fileName() << fi.absoluteFilePath();
|
||||||
|
QFile fl(fi.absoluteFilePath());
|
||||||
|
fl.remove();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void removeCursorFiles (QDir &dir) {
|
||||||
|
QString pt = dir.path();
|
||||||
|
if (!pt.isEmpty() && pt != "/") pt += "/";
|
||||||
|
const char **nlst = nameTransTbl;
|
||||||
|
while (*nlst) {
|
||||||
|
nlst += 2; // skip non-files
|
||||||
|
while (*nlst) {
|
||||||
|
QString n(*nlst);
|
||||||
|
QFile fl(pt+n);
|
||||||
|
qDebug() << "removing" << fl.fileName();
|
||||||
|
fl.remove();
|
||||||
|
nlst++;
|
||||||
|
}
|
||||||
|
nlst++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
const char **XCursorTheme::findCursorByFXId (int id) {
|
||||||
|
if (id < 0 || id > 19) return 0; // invalid id
|
||||||
|
const char **nlst = nameTransTbl;
|
||||||
|
while (*nlst) {
|
||||||
|
int lid = (**nlst)&0xff;
|
||||||
|
nlst += 2; // skip unnecessary
|
||||||
|
if (lid == id) return nlst;
|
||||||
|
while (nlst[-1]) nlst++ ; // skip
|
||||||
|
}
|
||||||
|
return 0; // none found
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* type:
|
||||||
|
* 0: by CursorXP name
|
||||||
|
* 1: by Xcursor name
|
||||||
|
* return:
|
||||||
|
* pointer to Xcursor name list
|
||||||
|
*/
|
||||||
|
const char **XCursorTheme::findCursorRecord (const QString &cname, int type) {
|
||||||
|
QByteArray ba(cname.toUtf8());
|
||||||
|
const char *name = ba.constData();
|
||||||
|
const char **nlst = nameTransTbl;
|
||||||
|
while (*nlst) {
|
||||||
|
nlst += 2; // skip unnecessary
|
||||||
|
if (!type) {
|
||||||
|
// by CursorXP name
|
||||||
|
if (!strcmp(name, nlst[-1])) return nlst;
|
||||||
|
} else {
|
||||||
|
// by Xcursor name
|
||||||
|
// find name
|
||||||
|
const char **nx = nlst;
|
||||||
|
while (*nx && strcmp(*nx, name)) nx++;
|
||||||
|
if (*nx) return nlst; // we got it!
|
||||||
|
}
|
||||||
|
while (nlst[-1]) nlst++ ; // skip
|
||||||
|
}
|
||||||
|
return 0; // none found
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString XCursorTheme::findCursorFile (const QDir &dir, const char *name) {
|
||||||
|
QString d(dir.path());
|
||||||
|
if (d != "/") d += "/";
|
||||||
|
d += "cursors/";
|
||||||
|
const char **nlst = nameTransTbl;
|
||||||
|
while (*nlst) {
|
||||||
|
nlst += 2; // skip unnecessary
|
||||||
|
// find name
|
||||||
|
const char **nx = nlst;
|
||||||
|
while (*nx && strcmp(*nx, name)) nx++;
|
||||||
|
if (*nx) {
|
||||||
|
// we got it!
|
||||||
|
//qDebug() << "found" << *nx << "(" << *nlst << ")";
|
||||||
|
nx = nlst;
|
||||||
|
while (*nx) {
|
||||||
|
QString s(*nx);
|
||||||
|
//qDebug() << "checking" << s;
|
||||||
|
QFileInfo fl(d+s);
|
||||||
|
if (fl.exists() && fl.isReadable()) {
|
||||||
|
//qDebug() << " ok" << s;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
nx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (nlst[-1]) nlst++ ; // skip
|
||||||
|
}
|
||||||
|
return QString(); // none found
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorTheme::XCursorTheme () :
|
||||||
|
mName(""), mPath(""), mTitle(""), mAuthor(""), mLicense(""),
|
||||||
|
mEMail(""), mSite(""), mDescr(""), mIM(""), mSample("left_ptr")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorTheme::XCursorTheme (const QDir &aDir, const QString &aName) :
|
||||||
|
mName(aName), mPath(aDir.path()), mTitle(""), mAuthor(""), mLicense(""),
|
||||||
|
mEMail(""), mSite(""), mDescr(""), mIM(""), mSample("left_ptr")
|
||||||
|
{
|
||||||
|
parseXCursorTheme(aDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorTheme::~XCursorTheme () {
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorTheme::writeToDir (const QDir &destDir) {
|
||||||
|
bool res = true;
|
||||||
|
QDir dir (destDir);
|
||||||
|
dir.mkdir("cursors");
|
||||||
|
if (!dir.exists("cursors")) return false;
|
||||||
|
dir.cd("cursors");
|
||||||
|
removeCursorFiles(dir);
|
||||||
|
//
|
||||||
|
foreach (const XCursorImages *ci, mList) {
|
||||||
|
const char **nlst = findCursorRecord(ci->name());
|
||||||
|
if (!nlst) continue; // unknown cursor, skip it
|
||||||
|
qDebug() << "writing" << *nlst;
|
||||||
|
{
|
||||||
|
QByteArray ba(ci->genXCursor());
|
||||||
|
QFile fo(dir.path()+"/"+ci->name());
|
||||||
|
if (fo.open(QIODevice::WriteOnly)) {
|
||||||
|
fo.write(ba);
|
||||||
|
fo.close();
|
||||||
|
} else {
|
||||||
|
res = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// make symlinks
|
||||||
|
const char *orig = *nlst;
|
||||||
|
nlst++;
|
||||||
|
while (*nlst) {
|
||||||
|
qDebug() << "symlinking to" << orig << "as" << *nlst;
|
||||||
|
QByteArray newName(QFile::encodeName(dir.path()+"/"+(*nlst)));
|
||||||
|
qDebug() << "old" << orig << "new" << newName.constData();
|
||||||
|
if (symlink(orig, newName.constData())) {
|
||||||
|
res = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nlst++;
|
||||||
|
}
|
||||||
|
if (!res) break;
|
||||||
|
nlst++;
|
||||||
|
}
|
||||||
|
if (res) res = writeIndexTheme(destDir);
|
||||||
|
if (!res) removeCursorFiles(dir);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorTheme::parseThemeIndex (const QDir &dir) {
|
||||||
|
QString ifn = dir.path();
|
||||||
|
if (!ifn.isEmpty() && ifn != "/") ifn += "/";
|
||||||
|
ifn += "index.theme";
|
||||||
|
qDebug() << "reading theme index:" << ifn;
|
||||||
|
QFile fl(ifn);
|
||||||
|
//
|
||||||
|
QString cmt;
|
||||||
|
mInherits.clear();
|
||||||
|
// read config file, drop out 'icon theme' section (IT'S BAD!)
|
||||||
|
if (fl.open(QIODevice::ReadOnly)) {
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
bool inIconTheme = false;
|
||||||
|
QString curPath;
|
||||||
|
while (1) {
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull()) break;
|
||||||
|
QString orig(s);
|
||||||
|
s = s.trimmed();
|
||||||
|
if (s.isEmpty() || s[0] == '#' || s[0] == ';') continue;
|
||||||
|
if (s[0] == '[') {
|
||||||
|
// new path
|
||||||
|
int len = s.length()-1;
|
||||||
|
if (s[len] == ']') len--;
|
||||||
|
s = s.mid(1, len).simplified();
|
||||||
|
curPath = s.toLower();
|
||||||
|
inIconTheme = (curPath == "icon theme");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!inIconTheme) continue;
|
||||||
|
int eqp = s.indexOf('=');
|
||||||
|
if (eqp < 0) continue; // invalid entry
|
||||||
|
QString name = s.left(eqp).simplified().toLower();
|
||||||
|
QString value = s.mid(eqp+1).simplified();
|
||||||
|
qDebug() << name << value;
|
||||||
|
if (name == "name" && !value.isEmpty()) mTitle = value;
|
||||||
|
else if (name == "comment" && !value.isEmpty()) cmt = value;
|
||||||
|
else if (name == "author" && !value.isEmpty()) mAuthor = value;
|
||||||
|
else if (name == "url" && !value.isEmpty()) mSite = value;
|
||||||
|
else if (name == "description" && !value.isEmpty()) mDescr = value;
|
||||||
|
else if (name == "example" && !value.isEmpty()) mSample = value;
|
||||||
|
else if (name == "inherits" && !value.isEmpty()) mInherits << value;
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
if (mDescr.isEmpty() && !cmt.isEmpty()) mDescr = cmt;
|
||||||
|
if (mSample.isEmpty()) mSample = "left_ptr";
|
||||||
|
mInherits.removeDuplicates();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorTheme::dumpInfo () {
|
||||||
|
/*
|
||||||
|
qDebug() <<
|
||||||
|
"INFO:" <<
|
||||||
|
"\n name:" << mName <<
|
||||||
|
"\n path:" << mPath <<
|
||||||
|
"\n title:" << mTitle <<
|
||||||
|
"\n author:" << mAuthor <<
|
||||||
|
"\n license:" << mLicense <<
|
||||||
|
"\n mail:" << mEMail <<
|
||||||
|
"\n site:" << mSite <<
|
||||||
|
"\n dscr:" << mDescr <<
|
||||||
|
"\n im:" << mIM <<
|
||||||
|
"\n sample:" << mSample <<
|
||||||
|
"\n inherits:" << mInherits
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorTheme::parseXCursorTheme (const QDir &dir) {
|
||||||
|
parseThemeIndex(dir);
|
||||||
|
dumpInfo();
|
||||||
|
const char **nlst = nameTransTbl;
|
||||||
|
QDir dr(dir); dr.cd("cursors");
|
||||||
|
while (*nlst) {
|
||||||
|
//qDebug() << "CurFX: (" << nlst[1] << ")";
|
||||||
|
nlst += 2; // skip unnecessary
|
||||||
|
//qDebug() << "searching" << *nlst;
|
||||||
|
QString fn = findCursorFile(dir, *nlst);
|
||||||
|
if (fn.isEmpty()) continue; // no such file
|
||||||
|
//qDebug() << " Xcrusor: (" << nlst[0] << ")";
|
||||||
|
while (nlst[-1]) nlst++ ; // skip
|
||||||
|
//qDebug() << " skiped: (" << nlst[1] << ")";
|
||||||
|
qDebug() << "loading" << fn;
|
||||||
|
XCursorImages *ci = new XCursorImagesXCur(dr, fn);
|
||||||
|
if (ci->count()) {
|
||||||
|
qDebug() << " OK:" << fn << "name:" << ci->name();
|
||||||
|
if (mTitle.isEmpty() && !ci->title().isEmpty()) mTitle = ci->title();
|
||||||
|
if (mAuthor.isEmpty() && !ci->author().isEmpty()) mAuthor = ci->author();
|
||||||
|
if (mLicense.isEmpty() && !ci->license().isEmpty()) mLicense = ci->license();
|
||||||
|
if (mEMail.isEmpty() && !ci->mail().isEmpty()) mEMail = ci->mail();
|
||||||
|
if (mSite.isEmpty() && !ci->site().isEmpty()) mSite = ci->site();
|
||||||
|
if (mDescr.isEmpty() && !ci->descr().isEmpty()) mDescr = ci->descr();
|
||||||
|
if (mIM.isEmpty() && !ci->im().isEmpty()) mIM = ci->im();
|
||||||
|
mList << ci;
|
||||||
|
dumpInfo();
|
||||||
|
} else {
|
||||||
|
qWarning() << "can't load" << fn << nlst[-2];
|
||||||
|
delete ci;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dumpInfo();
|
||||||
|
fixInfoFields();
|
||||||
|
dumpInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorTheme::fixInfoFields () {
|
||||||
|
foreach (XCursorImages *ci, mList) {
|
||||||
|
if (!mTitle.isEmpty() && ci->title().isEmpty()) ci->setTitle(title());
|
||||||
|
if (!mAuthor.isEmpty() && ci->author().isEmpty()) ci->setAuthor(author());
|
||||||
|
if (!mLicense.isEmpty() && ci->license().isEmpty()) ci->setLicense(license());
|
||||||
|
if (!mEMail.isEmpty() && ci->mail().isEmpty()) ci->setMail(mail());
|
||||||
|
if (!mSite.isEmpty() && ci->site().isEmpty()) ci->setSite(site());
|
||||||
|
if (!mDescr.isEmpty() && ci->descr().isEmpty()) ci->setDescr(descr());
|
||||||
|
if (!mIM.isEmpty() && ci->im().isEmpty()) ci->setIM(im());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorTheme::writeIndexTheme (const QDir &destDir) {
|
||||||
|
QString ifn = destDir.path();
|
||||||
|
if (!ifn.isEmpty() && ifn != "/") ifn += "/";
|
||||||
|
ifn += "index.theme";
|
||||||
|
qDebug() << "writing theme index:" << ifn;
|
||||||
|
QFile fl(ifn);
|
||||||
|
//
|
||||||
|
QStringList cfg, inhs, iconOther;
|
||||||
|
QString name, cmt, author, url, dscr, sample;
|
||||||
|
inhs.append(mInherits);
|
||||||
|
// read config file, drop out 'icon theme' section (IT'S BAD!)
|
||||||
|
if (fl.open(QIODevice::ReadOnly)) {
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
QString curPath;
|
||||||
|
while (1) {
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull()) break;
|
||||||
|
QString orig(s);
|
||||||
|
s = s.trimmed();
|
||||||
|
if (s.isEmpty() || s[0] == '#' || s[0] == ';') {
|
||||||
|
if (curPath != "icon theme") cfg << orig;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (s[0] == '[') {
|
||||||
|
// new path
|
||||||
|
int len = s.length()-1;
|
||||||
|
if (s[len] == ']') len--;
|
||||||
|
s = s.mid(1, len).simplified();
|
||||||
|
curPath = s.toLower();
|
||||||
|
if (curPath != "icon theme") cfg << orig;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (curPath != "icon theme") cfg << orig;
|
||||||
|
else {
|
||||||
|
int eqp = s.indexOf('=');
|
||||||
|
if (eqp < 0) {
|
||||||
|
// invalid entry
|
||||||
|
iconOther << orig;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
QString name = s.left(eqp).simplified();
|
||||||
|
QString value = s.mid(eqp+1).simplified();
|
||||||
|
if (name.isEmpty()) {
|
||||||
|
// invalid entry
|
||||||
|
iconOther << orig;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
QString nn(name.toLower());
|
||||||
|
if (nn == "name") name = value;
|
||||||
|
else if (nn == "comment") cmt = value;
|
||||||
|
else if (nn == "author") author = value;
|
||||||
|
else if (nn == "url") url = value;
|
||||||
|
else if (nn == "description") dscr = value;
|
||||||
|
else if (nn == "example") sample = value;
|
||||||
|
else if (nn == "inherits") { if (!value.isEmpty()) inhs << value; }
|
||||||
|
else iconOther << orig;
|
||||||
|
/*
|
||||||
|
Name=Fire Dragon
|
||||||
|
Comment=Fire Dragon Cursor Theme -- part of the 'Four Dragons' suite; (c) Sleeping Dragon, http://sleeping-dragon.deviantart.com/art/Fire-Dragon-30419542
|
||||||
|
Author=Sleeping Dragon
|
||||||
|
Url=http://sleeping-dragon.deviantart.com/art/Fire-Dragon-30419542
|
||||||
|
Description=Fire Dragon Cursor Theme -- part of the 'Four Dragons' suite
|
||||||
|
Example=left_ptr
|
||||||
|
Inherits=core
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
}
|
||||||
|
// theme file parsed; rewrite it!
|
||||||
|
if (cfg.size() > 0 && !cfg.at(cfg.size()-1).isEmpty()) cfg << "";
|
||||||
|
if (!fl.open(QIODevice::WriteOnly)) return false;
|
||||||
|
if (name.isEmpty()) name = mTitle;
|
||||||
|
if (author.isEmpty()) author = mAuthor;
|
||||||
|
if (url.isEmpty()) url = mSite;
|
||||||
|
if (dscr.isEmpty()) dscr = mDescr;
|
||||||
|
if (cmt.isEmpty()) cmt = dscr;
|
||||||
|
/*if (sample.isEmpty())*/ sample = "left_ptr";
|
||||||
|
if (inhs.size() == 0) inhs << "core";
|
||||||
|
inhs.removeDuplicates();
|
||||||
|
dumpInfo();
|
||||||
|
/*
|
||||||
|
qDebug() <<
|
||||||
|
"***INFO:" <<
|
||||||
|
"\n name:" << name <<
|
||||||
|
"\n cmt:" << cmt <<
|
||||||
|
"\n author:" << author <<
|
||||||
|
"\n site:" << url <<
|
||||||
|
"\n dscr:" << dscr <<
|
||||||
|
"\n sample:" << mSample <<
|
||||||
|
"\n inherits:" << inhs
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
foreach (const QString &s, cfg) stream << s << "\n";
|
||||||
|
stream << "[Icon Theme]\n";
|
||||||
|
stream << "Name=" << name << "\n";
|
||||||
|
stream << "Comment=" << cmt << "\n";
|
||||||
|
stream << "Author=" << author << "\n";
|
||||||
|
stream << "Url=" << url << "\n";
|
||||||
|
stream << "Description=" << dscr << "\n";
|
||||||
|
stream << "Example=" << mSample << "\n";
|
||||||
|
foreach (const QString &s, inhs) stream << "Inherits=" << s << "\n";
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
static bool removeXCTheme (const QDir &thDir) {
|
||||||
|
if (thDir.exists("cursors")) {
|
||||||
|
QDir d(thDir);
|
||||||
|
d.cd("cursors");
|
||||||
|
//removeCursorFiles(d);
|
||||||
|
removeFiles(d);
|
||||||
|
}
|
||||||
|
thDir.rmdir("cursors");
|
||||||
|
// check if there are some other files
|
||||||
|
QFileInfoList lst = thDir.entryInfoList(QDir::AllDirs | QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
bool cantKill = false;
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
QString s(fi.fileName());
|
||||||
|
if (s != "icon-theme.cache" && s != "index.theme") {
|
||||||
|
cantKill = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// can kill this?
|
||||||
|
if (!cantKill) {
|
||||||
|
QDir d(thDir);
|
||||||
|
d.remove("icon-theme.cache");
|
||||||
|
d.remove("index.theme");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool removeXCursorTheme (const QDir &thDir, const QString &name) {
|
||||||
|
qDebug() << "to kill:" << thDir.path() << name;
|
||||||
|
QDir d(thDir);
|
||||||
|
if (!d.exists(name)) return false;
|
||||||
|
qDebug() << "removing" << d.path() << name;
|
||||||
|
d.cd(name);
|
||||||
|
removeXCTheme(d);
|
||||||
|
d.cd("..");
|
||||||
|
d.rmdir(name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool removeXCursorTheme (const QString &name) {
|
||||||
|
QDir d(QDir::homePath());
|
||||||
|
return removeXCursorTheme(d, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool removeXCursorTheme (const QDir &thDir) {
|
||||||
|
QString name(thDir.path());
|
||||||
|
while (!name.isEmpty() && name.endsWith('/')) name.chop(1);
|
||||||
|
int i = name.lastIndexOf('/');
|
||||||
|
if (i < 1) return false;
|
||||||
|
name = name.mid(i+1);
|
||||||
|
QDir d(thDir);
|
||||||
|
d.cd("..");
|
||||||
|
return removeXCursorTheme(d, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
/*
|
||||||
|
* returns temporary dir or empty string
|
||||||
|
*/
|
||||||
|
static bool tarDir (const QString &destFName, const QDir &pth, const QString &dir) {
|
||||||
|
QStringList args;
|
||||||
|
|
||||||
|
QFile fl(destFName);
|
||||||
|
fl.remove();
|
||||||
|
|
||||||
|
args << "-c"; // create archive...
|
||||||
|
args << "-z"; // and gzip it
|
||||||
|
QString ps(pth.path());
|
||||||
|
if (!ps.isEmpty() && ps != ".") {
|
||||||
|
args << "-C"; // dir to go
|
||||||
|
args << ps;
|
||||||
|
}
|
||||||
|
args << "-f"; // to file
|
||||||
|
args << destFName;
|
||||||
|
QString s(dir);
|
||||||
|
if (!s.endsWith('/')) s += '/';
|
||||||
|
args << s;
|
||||||
|
|
||||||
|
QProcess pr;
|
||||||
|
pr.setStandardInputFile("/dev/null");
|
||||||
|
pr.setStandardOutputFile("/dev/null");
|
||||||
|
pr.setStandardErrorFile("/dev/null");
|
||||||
|
|
||||||
|
pr.start("tar", args);
|
||||||
|
|
||||||
|
if (pr.waitForStarted()) {
|
||||||
|
if (pr.waitForFinished()) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
fl.remove();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//tar -c -C /home/ketmar/k8prj/xcurtheme/src -f z.tar xcr/
|
||||||
|
|
||||||
|
|
||||||
|
bool packXCursorTheme (const QString &destFName, const QDir &thDir, const QString &thName, bool removeTheme) {
|
||||||
|
if (destFName.isEmpty() || thName.isEmpty()) return false;
|
||||||
|
QDir d(thDir);
|
||||||
|
if (!d.cd(thName)) return false;
|
||||||
|
|
||||||
|
bool res = tarDir(destFName, thDir, thName);
|
||||||
|
if (res && removeTheme) {
|
||||||
|
removeFilesAndDirs(d);
|
||||||
|
d.cd("..");
|
||||||
|
d.rmdir(thName);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorTheme::writeXPTheme (const QDir &destDir) {
|
||||||
|
QString ifn = destDir.path();
|
||||||
|
if (!ifn.isEmpty() && ifn != "/") ifn += '/';
|
||||||
|
|
||||||
|
QFile fl(ifn+"Scheme.ini");
|
||||||
|
if (fl.open(QIODevice::WriteOnly)) {
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
stream << "[General]\r\n";
|
||||||
|
stream << "Version=130\r\n";
|
||||||
|
qDebug() << "writing images...";
|
||||||
|
foreach (XCursorImages *ci, mList) {
|
||||||
|
const char **nlst = findCursorRecord(ci->name());
|
||||||
|
if (!nlst) continue; // unknown cursor, skip it
|
||||||
|
qDebug() << "image:" << *(nlst-1);
|
||||||
|
QImage img(ci->buildImage());
|
||||||
|
if (!img.save(ifn+(*(nlst-1))+".png")) return false;
|
||||||
|
stream << "["+QString(*(nlst-1))+"]\r\n";
|
||||||
|
stream << "StdCursor=0\r\n";
|
||||||
|
stream << "Frames=" << ci->count() << "\r\n";
|
||||||
|
stream << "Hot spot x=" << ci->at(0)->xhot() << "\r\n";
|
||||||
|
stream << "Hot spot y=" << ci->at(0)->yhot() << "\r\n";
|
||||||
|
stream << "Interval=" << (ci->at(0)->delay() == 2147483647 ? 100 : ci->at(0)->delay()) << "\r\n";
|
||||||
|
// x2, y2? wtf?
|
||||||
|
if (ci->count() > 1) {
|
||||||
|
stream << "Frames=" << ci->count() << "\r\n";
|
||||||
|
stream << "Animation style=0\r\n";
|
||||||
|
} else {
|
||||||
|
stream << "Frames=1\r\n";
|
||||||
|
stream << "Animation style=0\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stream << "[[Description]\r\n";
|
||||||
|
if (!mName.isEmpty()) stream << mName << "\r\n";
|
||||||
|
if (!mTitle.isEmpty()) stream << mTitle << "\r\n";
|
||||||
|
if (!mAuthor.isEmpty()) stream << mAuthor << "\r\n";
|
||||||
|
if (!mLicense.isEmpty()) stream << mLicense << "\r\n";
|
||||||
|
if (!mEMail.isEmpty()) stream << mEMail << "\r\n";
|
||||||
|
if (!mSite.isEmpty()) stream << mSite << "\r\n";
|
||||||
|
if (!mDescr.isEmpty()) stream << mDescr << "\r\n";
|
||||||
|
if (!mIM.isEmpty()) stream << mIM << "\r\n";
|
||||||
|
}
|
||||||
|
fl.close();
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef XCRTHEME_H
|
||||||
|
#define XCRTHEME_H
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorTheme {
|
||||||
|
public:
|
||||||
|
XCursorTheme (const QDir &aDir, const QString &aName);
|
||||||
|
XCursorTheme ();
|
||||||
|
virtual ~XCursorTheme ();
|
||||||
|
|
||||||
|
inline const QString &name () const { return mName; }
|
||||||
|
inline const QString &path () const { return mPath; }
|
||||||
|
inline const QString &title () const { return mTitle; }
|
||||||
|
inline const QString &author () const { return mAuthor; }
|
||||||
|
inline const QString &license () const { return mLicense; }
|
||||||
|
inline const QString &mail () const { return mEMail; }
|
||||||
|
inline const QString &site () const { return mSite; }
|
||||||
|
inline const QString &descr () const { return mDescr; }
|
||||||
|
inline const QString &im () const { return mIM; }
|
||||||
|
inline const QString &sample () const { return mSample; }
|
||||||
|
inline const QStringList &inherits () const { return mInherits; }
|
||||||
|
|
||||||
|
inline void setName (const QString &v) { mName = v; }
|
||||||
|
inline void setPath (const QString &v) { mPath = v; }
|
||||||
|
inline void setTitle (const QString &v) { mTitle = v; }
|
||||||
|
inline void setAuthor (const QString &v) { mAuthor = v; }
|
||||||
|
inline void setLicense (const QString &v) { mLicense = v; }
|
||||||
|
inline void setMail (const QString &v) { mEMail = v; }
|
||||||
|
inline void setSite (const QString &v) { mSite = v; }
|
||||||
|
inline void setDescr (const QString &v) { mDescr = v; }
|
||||||
|
inline void setIM (const QString &v) { mIM = v; }
|
||||||
|
inline void setSample (const QString &v) { mSample = v; }
|
||||||
|
inline void setInherits (const QStringList &v) { mInherits.clear(); mInherits.append(v); }
|
||||||
|
|
||||||
|
inline const QList<XCursorImages *> &list () const { return mList; }
|
||||||
|
inline const XCursorImages *at (int idx) const { return mList.at(idx); }
|
||||||
|
inline int count () const { return mList.size(); }
|
||||||
|
inline int size () const { return mList.size(); }
|
||||||
|
|
||||||
|
inline void append (XCursorImages *img) { mList << img; }
|
||||||
|
|
||||||
|
bool writeToDir (const QDir &destDir);
|
||||||
|
|
||||||
|
void fixInfoFields ();
|
||||||
|
|
||||||
|
bool writeXPTheme (const QDir &destDir);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static const char **findCursorByFXId (int id);
|
||||||
|
static QString findCursorFile (const QDir &dir, const char *name);
|
||||||
|
static const char **findCursorRecord (const QString &cname, int type=1);
|
||||||
|
|
||||||
|
bool writeIndexTheme (const QDir &destDir);
|
||||||
|
void parseXCursorTheme (const QDir &dir);
|
||||||
|
void parseThemeIndex (const QDir &dir);
|
||||||
|
|
||||||
|
void dumpInfo ();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
QString mName;
|
||||||
|
QString mPath;
|
||||||
|
QString mTitle;
|
||||||
|
QString mAuthor;
|
||||||
|
QString mLicense;
|
||||||
|
QString mEMail;
|
||||||
|
QString mSite;
|
||||||
|
QString mDescr;
|
||||||
|
QString mIM;
|
||||||
|
QString mSample;
|
||||||
|
QStringList mInherits;
|
||||||
|
QList<XCursorImages *> mList;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool removeXCursorTheme (const QDir &thDir, const QString &name);
|
||||||
|
bool removeXCursorTheme (const QString &name);
|
||||||
|
bool removeXCursorTheme (const QDir &thDir);
|
||||||
|
|
||||||
|
bool packXCursorTheme (const QString &destFName, const QDir &thDir, const QString &thName, bool removeTheme=false);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,400 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
//#include <QtCore>
|
||||||
|
|
||||||
|
#include "xcrthemefx.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include <QSet>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrxcur.h"
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
|
||||||
|
|
||||||
|
static const char *curShapeName[] = {
|
||||||
|
"standard arrow",
|
||||||
|
"help arrow (the one with '?')",
|
||||||
|
"working arrow",
|
||||||
|
"busy cursor",
|
||||||
|
"precision select",
|
||||||
|
"text select",
|
||||||
|
"handwriting",
|
||||||
|
"unavailable",
|
||||||
|
"north (vert) resize",
|
||||||
|
"south resize",
|
||||||
|
"west (vert-means horiz?) resize",
|
||||||
|
"east resize",
|
||||||
|
"north-west resize",
|
||||||
|
"south-east resize",
|
||||||
|
"north-east resize",
|
||||||
|
"south-west resize",
|
||||||
|
"move",
|
||||||
|
"alternate select",
|
||||||
|
"hand",
|
||||||
|
"button"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorThemeFX::str2num (const QString &s, quint32 &res) {
|
||||||
|
quint64 n = 0;
|
||||||
|
if (s.isEmpty()) return false;
|
||||||
|
for (int f = 0; f < s.length(); f++) {
|
||||||
|
QChar ch = s.at(f);
|
||||||
|
if (!ch.isDigit()) return false;
|
||||||
|
n = n*10+ch.unicode()-'0';
|
||||||
|
}
|
||||||
|
//if (n >= (quint64)0x100000000LL) n = 0xffffffffLL;
|
||||||
|
if (n >= (quint64)0x80000000LL) n = 0x7fffffffLL;
|
||||||
|
res = n;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QList<XCursorThemeFX::tAnimSeq> XCursorThemeFX::parseScript (const QString &script, quint32 maxFrame) {
|
||||||
|
QList<tAnimSeq> res;
|
||||||
|
QString scp = script; scp.replace("\r", "\n");
|
||||||
|
QStringList scpL = scp.split('\n', QString::SkipEmptyParts);
|
||||||
|
foreach (QString s, scpL) {
|
||||||
|
s = s.simplified();
|
||||||
|
//qDebug() << s;
|
||||||
|
QStringList fld = s.split(',', QString::SkipEmptyParts); //BUG!BUG!BUG!
|
||||||
|
if (fld.size() != 2) {
|
||||||
|
qDebug() << "script error:" << s;
|
||||||
|
qWarning() << "script error:" << s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// frame[s]
|
||||||
|
int hyph = fld[0].indexOf('-');
|
||||||
|
tAnimSeq a;
|
||||||
|
if (hyph == -1) {
|
||||||
|
// just a number
|
||||||
|
if (!str2num(fld[0], a.from)) {
|
||||||
|
qDebug() << "script error (frame):" << s;
|
||||||
|
qWarning() << "script error (frame):" << s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
a.from = qMax(qMin(maxFrame, a.from), (quint32)1)-1;
|
||||||
|
a.to = a.from;
|
||||||
|
} else {
|
||||||
|
// a..b
|
||||||
|
if (!str2num(fld[0].left(hyph), a.from)) {
|
||||||
|
qDebug() << "script error (frame from):" << s;
|
||||||
|
qWarning() << "script error (frame from):" << s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
a.from = qMax(qMin(maxFrame, a.from), (quint32)1)-1;
|
||||||
|
if (!str2num(fld[0].mid(hyph+1), a.to)) {
|
||||||
|
qDebug() << "script error (frame to):" << s;
|
||||||
|
qWarning() << "script error (frame to):" << s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
a.to = qMax(qMin(maxFrame, a.to), (quint32)1)-1;
|
||||||
|
}
|
||||||
|
// delay
|
||||||
|
if (!str2num(fld[1], a.delay)) {
|
||||||
|
qDebug() << "script error (delay):" << s;
|
||||||
|
qWarning() << "script error (delay):" << s;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (a.delay < 10) a.delay = 10;
|
||||||
|
qDebug() << "from" << a.from << "to" << a.to << "delay" << a.delay;
|
||||||
|
res << a;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
static QByteArray zlibInflate (const void *buf, int bufSz, int destSz) {
|
||||||
|
QByteArray res;
|
||||||
|
z_stream stream;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
res.resize(destSz+1);
|
||||||
|
stream.next_in = (Bytef *)buf;
|
||||||
|
stream.avail_in = bufSz;
|
||||||
|
stream.zalloc = (alloc_func)0;
|
||||||
|
stream.zfree = (free_func)0;
|
||||||
|
stream.next_out = (Bytef *)res.data();
|
||||||
|
stream.avail_out = destSz;
|
||||||
|
|
||||||
|
err = inflateInit(&stream);
|
||||||
|
if (err != Z_OK) return QByteArray();
|
||||||
|
err = inflate(&stream, Z_SYNC_FLUSH);
|
||||||
|
fprintf(stderr, "inflate result: %i\n", err);
|
||||||
|
switch (err) {
|
||||||
|
case Z_STREAM_END:
|
||||||
|
err = inflateEnd(&stream);
|
||||||
|
fprintf(stderr, "Z_STREAM_END: inflate result: %i\n", err);
|
||||||
|
if (err != Z_OK) return QByteArray();
|
||||||
|
break;
|
||||||
|
case Z_OK:
|
||||||
|
err = inflateEnd(&stream);
|
||||||
|
fprintf(stderr, "Z_OK: inflate result: %i\n", err);
|
||||||
|
if (err != Z_OK) return QByteArray();
|
||||||
|
break;
|
||||||
|
default: return QByteArray();
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static quint32 baGetDW (QByteArray &ba, int &pos) {
|
||||||
|
const uchar *d = (const uchar *)ba.constData();
|
||||||
|
d += pos+3;
|
||||||
|
pos += 4;
|
||||||
|
quint32 res = 0;
|
||||||
|
for (int f = 4; f > 0; f--, d--) {
|
||||||
|
res <<= 8;
|
||||||
|
res |= *d;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorThemeFX::XCursorThemeFX (const QString &aFileName) : XCursorTheme() {
|
||||||
|
if (!parseCursorFXTheme(aFileName)) {
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorThemeFX::parseCursorFXTheme (const QString &aFileName) {
|
||||||
|
qDebug() << "loading" << aFileName;
|
||||||
|
QFile fl(aFileName);
|
||||||
|
if (!fl.open(QIODevice::ReadOnly)) return false; // shit!
|
||||||
|
QByteArray ba(fl.readAll());
|
||||||
|
fl.close();
|
||||||
|
if (ba.size() < 0xb8) return false; // shit!
|
||||||
|
int pos = 0;
|
||||||
|
if (baGetDW(ba, pos) != 1) return false; // invalid version
|
||||||
|
quint32 mainHdrSize = baGetDW(ba, pos);
|
||||||
|
if (mainHdrSize < 0xb8) return false; // invalid header size
|
||||||
|
quint32 unDataSize = baGetDW(ba, pos);
|
||||||
|
if (unDataSize < 0x4c) return false; // no cursors anyway
|
||||||
|
struct {
|
||||||
|
quint32 ofs;
|
||||||
|
quint32 len;
|
||||||
|
} infoFields[6];
|
||||||
|
pos = 0x84;
|
||||||
|
for (int f = 0; f < 6; f++) {
|
||||||
|
infoFields[f].ofs = baGetDW(ba, pos);
|
||||||
|
infoFields[f].len = baGetDW(ba, pos);
|
||||||
|
}
|
||||||
|
pos = 0xb4;
|
||||||
|
quint32 ihdrSize = baGetDW(ba, pos);
|
||||||
|
// now read data
|
||||||
|
pos = mainHdrSize;
|
||||||
|
qDebug() << "reading data from" << pos;
|
||||||
|
QByteArray unp(zlibInflate(ba.constData()+pos, ba.size()-pos, unDataSize));
|
||||||
|
if (unp.isEmpty()) {
|
||||||
|
qDebug() << "CursorFX: can't depack data";
|
||||||
|
qWarning() << "CursorFX: can't depack data";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// process info section
|
||||||
|
for (int f = 0; f < 6; f++) {
|
||||||
|
int len = infoFields[f].len;
|
||||||
|
if (!len) continue;
|
||||||
|
pos = infoFields[f].ofs;
|
||||||
|
if ((quint32)pos >= ihdrSize || (quint32)pos+len >= ihdrSize) continue; // skip invalid one
|
||||||
|
QByteArray sBA(unp.mid(pos, len));
|
||||||
|
sBA.append('\0'); sBA.append('\0');
|
||||||
|
QString s = QString::fromUtf16((const ushort *)sBA.constData()).simplified();
|
||||||
|
switch (f) {
|
||||||
|
case 0: setTitle(s); break;
|
||||||
|
case 1: setAuthor(s); break;
|
||||||
|
//case 2: setVersion(s); break;
|
||||||
|
case 3: setSite(s); break;
|
||||||
|
case 4: setMail(s); break;
|
||||||
|
case 5: setDescr(s); break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// process resources
|
||||||
|
QSet<quint8> shapesSeen;
|
||||||
|
pos = ihdrSize;
|
||||||
|
qDebug() << "resources started at hex" << QString::number(pos, 16);
|
||||||
|
while (pos <= unp.size()-12) {
|
||||||
|
quint32 ipos = pos; // will be fixed later
|
||||||
|
quint32 rtype = baGetDW(unp, pos);
|
||||||
|
quint32 basicHdrSize = baGetDW(unp, pos);
|
||||||
|
quint32 itemSize = baGetDW(unp, pos);
|
||||||
|
qDebug() << "pos hex:" << QString::number(pos, 16) << "rtype:" << rtype << "bhdrsz hex:" << QString::number(basicHdrSize, 16) << "itemsz hex:" << QString::number(itemSize, 16);
|
||||||
|
if (itemSize < 12) {
|
||||||
|
// invalid data
|
||||||
|
qDebug() << "CursorFX: invalid data chunk size";
|
||||||
|
qWarning() << "CursorFX: invalid data chunk size";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pos = ipos+itemSize; // skip it
|
||||||
|
if (rtype != 2) continue; // not cursor resource
|
||||||
|
if (itemSize < 0x4c) {
|
||||||
|
qDebug() << "CursorFX: invalid cursor chunk size:" << itemSize;
|
||||||
|
qWarning() << "CursorFX: invalid cursor chunk size:" << itemSize;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// cursor
|
||||||
|
int cps = ipos+3*4;
|
||||||
|
rtype = baGetDW(unp, cps);
|
||||||
|
if (rtype != 2) {
|
||||||
|
qDebug() << "CursorFX: invalid cursor chunk type:" << rtype;
|
||||||
|
qWarning() << "CursorFX: invalid cursor chunk type:" << rtype;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
quint32 curShape = baGetDW(unp, cps);
|
||||||
|
quint32 curType = baGetDW(unp, cps);
|
||||||
|
if (curShape > 19) {
|
||||||
|
qDebug() << "CursorFX: unknown cursor shape:" << curShape;
|
||||||
|
qWarning() << "CursorFX: unknown cursor shape:" << curShape;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (curType != 1) {
|
||||||
|
qDebug() << "skiping 'press' cursor; shape no" << curShape << "named" << curShapeName[curShape];
|
||||||
|
continue;
|
||||||
|
// we need only 'normal' cursors
|
||||||
|
}
|
||||||
|
qDebug() << "cursor shape:" << curShape;
|
||||||
|
const char **nlst = findCursorByFXId((int)curShape);
|
||||||
|
if (!nlst) {
|
||||||
|
// unknown cursor type, skip it
|
||||||
|
qDebug() << "CursorFX: skiping cursor shape:" << curShapeName[curShape];
|
||||||
|
qWarning() << "CursorFX: skiping cursor shape:" << curShapeName[curShape];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (shapesSeen.contains(curShape&0xff)) {
|
||||||
|
// unknown cursor type, skip it
|
||||||
|
qDebug() << "CursorFX: skiping duplicate cursor shape:" << curShapeName[curShape];
|
||||||
|
qWarning() << "CursorFX: skiping duplicate cursor shape:" << curShapeName[curShape];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
shapesSeen << (curShape&0xff);
|
||||||
|
qDebug() << "importing cursor" << *nlst;
|
||||||
|
quint32 unk0 = baGetDW(unp, cps); // unknown field
|
||||||
|
quint32 frameCnt = baGetDW(unp, cps);
|
||||||
|
if (frameCnt < 1) frameCnt = 1; // just in case
|
||||||
|
quint32 imgWdt = baGetDW(unp, cps);
|
||||||
|
quint32 imgHgt = baGetDW(unp, cps);
|
||||||
|
quint32 imgDelay = baGetDW(unp, cps);
|
||||||
|
quint32 aniFlags = baGetDW(unp, cps);
|
||||||
|
quint32 unk1 = baGetDW(unp, cps); // unknown field
|
||||||
|
quint32 imgXHot = baGetDW(unp, cps);
|
||||||
|
quint32 imgYHot = baGetDW(unp, cps);
|
||||||
|
quint32 realHdrSize = baGetDW(unp, cps);
|
||||||
|
quint32 imgDataSize = baGetDW(unp, cps);
|
||||||
|
quint32 addonOfs = baGetDW(unp, cps);
|
||||||
|
quint32 addonLen = baGetDW(unp, cps);
|
||||||
|
if (imgDelay < 10) imgDelay = 10;
|
||||||
|
if (imgDelay >= (quint32)0x80000000LL) imgDelay = 0x7fffffffLL;
|
||||||
|
qDebug() <<
|
||||||
|
"cursor data:" <<
|
||||||
|
"\n frames:" << frameCnt <<
|
||||||
|
"\n width:" << imgWdt <<
|
||||||
|
"\n height:" << imgHgt <<
|
||||||
|
"\n delay:" << imgDelay <<
|
||||||
|
"\n flags:" << QString::number(aniFlags, 2) <<
|
||||||
|
"\n xhot:" << imgXHot <<
|
||||||
|
"\n yhot:" << imgYHot <<
|
||||||
|
"\n unk0:" << unk0 <<
|
||||||
|
"\n unk1:" << unk1 <<
|
||||||
|
"\n rhdata:" << QString::number(realHdrSize, 16) <<
|
||||||
|
"\n dataOfs:" << QString::number(ipos+realHdrSize, 16) <<
|
||||||
|
"\n cdataOfs:" << QString::number(ipos+basicHdrSize+addonLen, 16)
|
||||||
|
;
|
||||||
|
// now check if we have enought data
|
||||||
|
if (ipos+realHdrSize+imgDataSize > (quint32)pos) {
|
||||||
|
qDebug() << "CursorFX: cursor data too big";
|
||||||
|
qWarning() << "CursorFX: cursor data too big";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// addon is the script; parse it later
|
||||||
|
QList<tAnimSeq> aseq;
|
||||||
|
QString script;
|
||||||
|
if (addonLen) {
|
||||||
|
// script
|
||||||
|
if (addonOfs < 0x4c || addonOfs > realHdrSize) {
|
||||||
|
qDebug() << "CursorFX: invalid addon data offset";
|
||||||
|
qWarning() << "CursorFX: invalid addon data offset";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
QByteArray bs(unp.mid(ipos+addonOfs, addonLen));
|
||||||
|
bs.append('\0'); bs.append('\0');
|
||||||
|
script = QString::fromUtf16((const ushort *)bs.constData());
|
||||||
|
qDebug() << "script:\n" << script;
|
||||||
|
// create animseq
|
||||||
|
aseq = parseScript(script, frameCnt);
|
||||||
|
} else {
|
||||||
|
// create 'standard' animseq
|
||||||
|
tAnimSeq a;
|
||||||
|
a.from = 0; a.to = frameCnt-1; a.delay = imgDelay;
|
||||||
|
aseq << a;
|
||||||
|
// and back if 'alternate' flag set
|
||||||
|
if (aniFlags&0x01) {
|
||||||
|
a.from = frameCnt-1; a.to = 0;
|
||||||
|
aseq << a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (imgWdt*imgHgt*4 != imgDataSize) {
|
||||||
|
qDebug() << "data size:" << imgDataSize << "but should be" << imgWdt*imgHgt*4;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// decode image
|
||||||
|
QImage img((const uchar *)unp.constData()+ipos+realHdrSize, imgWdt, imgHgt, QImage::Format_ARGB32);
|
||||||
|
img = img.mirrored(false, true);
|
||||||
|
//
|
||||||
|
XCursorImages *cim = new XCursorImages(*nlst);
|
||||||
|
cim->setScript(script);
|
||||||
|
//!!!
|
||||||
|
//!!!img.save(QString("_png/%1.png").arg(cim->name()));
|
||||||
|
//!!!
|
||||||
|
quint32 frameWdt = img.width()/frameCnt;
|
||||||
|
qDebug() << "frameWdt:" << frameWdt << "left:" << img.width()%(frameWdt*frameCnt);
|
||||||
|
// now build animation sequence
|
||||||
|
int fCnt = 0;
|
||||||
|
foreach (const tAnimSeq &a, aseq) {
|
||||||
|
bool back = a.from > a.to; // going backwards
|
||||||
|
quint32 fNo = a.from;
|
||||||
|
for (;; fCnt++) {
|
||||||
|
//k8:qDebug() << " frame:" << fNo << "delay:" << a.delay;
|
||||||
|
// copy frame
|
||||||
|
QImage frame(img.copy(fNo*frameWdt, 0, frameWdt, img.height()));
|
||||||
|
//frame.save(QString("_png/%1_%2.png").arg(cim->name()).arg(QString::number(f)));
|
||||||
|
XCursorImage *i = new XCursorImage(QString("%1%2").arg(cim->name()).arg(QString::number(fCnt)),
|
||||||
|
frame, imgXHot, imgYHot, a.delay, 1
|
||||||
|
);
|
||||||
|
cim->append(i);
|
||||||
|
//
|
||||||
|
if (fNo == a.to) break;
|
||||||
|
if (back) fNo--; else fNo++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// append if not empty
|
||||||
|
if (cim->count()) {
|
||||||
|
// now check if it is looped and cancel looping if necessary
|
||||||
|
if ((aniFlags & 0x02) == 0) {
|
||||||
|
// not looped
|
||||||
|
qDebug() << " anti-loop fix";
|
||||||
|
XCursorImage *i = cim->item(cim->count()-1);
|
||||||
|
i->setDelay(0x7fffffffL);
|
||||||
|
//i->setCSize(2); // ???
|
||||||
|
}
|
||||||
|
mList << cim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef XCRTHEMEFX_H
|
||||||
|
#define XCRTHEMEFX_H
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorThemeFX : public XCursorTheme {
|
||||||
|
public:
|
||||||
|
XCursorThemeFX (const QString &aFileName);
|
||||||
|
|
||||||
|
public:
|
||||||
|
class tAnimSeq {
|
||||||
|
public:
|
||||||
|
quint32 from, to;
|
||||||
|
quint32 delay;
|
||||||
|
};
|
||||||
|
|
||||||
|
static QList<tAnimSeq> parseScript (const QString &script, quint32 maxFrame);
|
||||||
|
static bool str2num (const QString &s, quint32 &res);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool parseCursorFXTheme (const QString &aFileName);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,352 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
//#include <QtCore>
|
||||||
|
|
||||||
|
#include "xcrthemexp.h"
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include <QSet>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrxcur.h"
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
#include "xcrthemefx.h"
|
||||||
|
|
||||||
|
|
||||||
|
static const char *curShapeName[] = {
|
||||||
|
"Arrow",
|
||||||
|
"Cross",
|
||||||
|
"Hand",
|
||||||
|
"IBeam",
|
||||||
|
"UpArrow",
|
||||||
|
"SizeNWSE",
|
||||||
|
"SizeNESW",
|
||||||
|
"SizeWE",
|
||||||
|
"SizeNS",
|
||||||
|
"Help",
|
||||||
|
"Handwriting",
|
||||||
|
"AppStarting",
|
||||||
|
"SizeAll",
|
||||||
|
"Wait",
|
||||||
|
"NO",
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const char *findCurShapeName (const QString &s) {
|
||||||
|
QByteArray ba(s.toUtf8());
|
||||||
|
const char *name = ba.constData();
|
||||||
|
const char **nlst = curShapeName;
|
||||||
|
while (*nlst) {
|
||||||
|
if (!strcasecmp(name, *nlst)) return *nlst;
|
||||||
|
nlst++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static QString findFile (const QDir &dir, const QString &name, bool fullName=false) {
|
||||||
|
QFileInfoList lst = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
if (!name.compare(fi.fileName(), Qt::CaseInsensitive)) {
|
||||||
|
if (fullName) return fi.absoluteFilePath();
|
||||||
|
return fi.fileName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class CursorInfo {
|
||||||
|
public:
|
||||||
|
CursorInfo () { clear(); curSection.clear(); }
|
||||||
|
|
||||||
|
void clear () {
|
||||||
|
frameCnt = 1; delay = 50; xhot = yhot = 0;
|
||||||
|
script.clear();
|
||||||
|
wasFrameCnt = wasXHot = wasYHot = wasDelay = wasScript = wasAStyle = wasStdCur = false;
|
||||||
|
isStdCursor = false;
|
||||||
|
isLooped = true; is2way = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
quint32 frameCnt, delay, xhot, yhot;
|
||||||
|
QString script;
|
||||||
|
bool wasFrameCnt, wasXHot, wasYHot, wasDelay, wasScript, wasAStyle, wasStdCur;
|
||||||
|
bool isStdCursor;
|
||||||
|
bool isLooped, is2way;
|
||||||
|
QString curSection;
|
||||||
|
QString nextSection;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/* true: EOF */
|
||||||
|
static bool readNextSection (QTextStream &stream, CursorInfo &info) {
|
||||||
|
info.clear();
|
||||||
|
if (info.nextSection.isEmpty()) {
|
||||||
|
// find next section
|
||||||
|
//qDebug() << "searching section...";
|
||||||
|
for (;;) {
|
||||||
|
QString s;
|
||||||
|
info.curSection.clear();
|
||||||
|
info.nextSection.clear();
|
||||||
|
for (;;) {
|
||||||
|
s = stream.readLine();
|
||||||
|
if (s.isNull()) return true;
|
||||||
|
s = s.trimmed();
|
||||||
|
//qDebug() << "*" << s;
|
||||||
|
if (s.isEmpty() || s[0] == '#' || s[0] == ';') continue;
|
||||||
|
if (s[0] == '[') break;
|
||||||
|
}
|
||||||
|
int len = s.length()-1;
|
||||||
|
if (s[len] == ']') len--;
|
||||||
|
s = s.mid(1, len);
|
||||||
|
const char *csn = findCurShapeName(s);
|
||||||
|
if (!csn) continue;
|
||||||
|
// section found
|
||||||
|
info.curSection = csn;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
info.curSection = info.nextSection;
|
||||||
|
info.nextSection.clear();
|
||||||
|
}
|
||||||
|
// section found; read it
|
||||||
|
for (;;) {
|
||||||
|
QString s = stream.readLine();
|
||||||
|
if (s.isNull()) return true;
|
||||||
|
s = s.trimmed();
|
||||||
|
//qDebug() << "+" << s;
|
||||||
|
if (s.isEmpty() || s[0] == '#' || s[0] == ';') continue;
|
||||||
|
if (s[0] == '[') {
|
||||||
|
int len = s.length()-1;
|
||||||
|
if (s[len] == ']') len--;
|
||||||
|
s = s.mid(1, len);
|
||||||
|
const char *csn = findCurShapeName(s);
|
||||||
|
if (csn) info.nextSection = csn; else info.nextSection.clear();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
QStringList nv(s.split('='));
|
||||||
|
if (nv.size() != 2) continue; // invalid
|
||||||
|
QString name = nv[0].simplified().toLower();
|
||||||
|
quint32 num = 0;
|
||||||
|
bool numOk = XCursorThemeFX::str2num(nv[1].trimmed(), num);
|
||||||
|
if (!numOk) num = 0;
|
||||||
|
if (name == "frames") {
|
||||||
|
info.frameCnt = qMax(num, (quint32)1);
|
||||||
|
info.wasFrameCnt = true;
|
||||||
|
} else if (name == "interval") {
|
||||||
|
info.delay = qMax(qMin(num, (quint32)0x7fffffffL), (quint32)10);
|
||||||
|
info.wasDelay = true;
|
||||||
|
} else if (name == "animation style") {
|
||||||
|
info.isLooped = true;
|
||||||
|
info.is2way = (num != 0);
|
||||||
|
info.wasAStyle = true;
|
||||||
|
} else if (name == "hot spot x") {
|
||||||
|
info.xhot = num;
|
||||||
|
info.wasXHot = true;
|
||||||
|
} else if (name == "hot spot y") {
|
||||||
|
info.yhot = num;
|
||||||
|
info.wasYHot = true;
|
||||||
|
} else if (name == "framescript") {
|
||||||
|
// 1 or 0
|
||||||
|
} else if (name == "stdcursor") {
|
||||||
|
info.isStdCursor = (num!=0);
|
||||||
|
info.wasStdCur = true;
|
||||||
|
} else if (name == "hot spot x2" || name == "hot spot y2") {
|
||||||
|
} else if (name == "stdcursor" || name == "hot spot x2" || name == "hot spot y2") {
|
||||||
|
// nothing
|
||||||
|
} else {
|
||||||
|
qDebug() << "unknown param:" << name << nv[1];
|
||||||
|
qWarning() << "unknown param:" << name << nv[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void removeFilesAndDirs (QDir &dir) {
|
||||||
|
//qDebug() << "dir:" << dir.path();
|
||||||
|
// files
|
||||||
|
QFileInfoList lst = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
//qDebug() << "removing" << fi.fileName() << fi.absoluteFilePath();
|
||||||
|
dir.remove(fi.fileName());
|
||||||
|
}
|
||||||
|
// dirs
|
||||||
|
lst = dir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot | QDir::Hidden);
|
||||||
|
foreach (const QFileInfo &fi, lst) {
|
||||||
|
dir.cd(fi.fileName());
|
||||||
|
removeFilesAndDirs(dir);
|
||||||
|
dir.cd("..");
|
||||||
|
//qDebug() << "removing dir" << fi.fileName();
|
||||||
|
dir.rmdir(fi.fileName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns temporary dir or empty string
|
||||||
|
*/
|
||||||
|
static QString unzipFile (const QString &zipFile) {
|
||||||
|
QStringList args;
|
||||||
|
|
||||||
|
char tmpDirName[18];
|
||||||
|
strcpy(tmpDirName, "/tmp/unzXXXXXX");
|
||||||
|
char *td = mkdtemp(tmpDirName);
|
||||||
|
if (!td) return QString();
|
||||||
|
|
||||||
|
QDir dir(td);
|
||||||
|
|
||||||
|
args << "-b"; // all files are binary
|
||||||
|
args << "-D"; // skip timestamps
|
||||||
|
args << "-n"; // never overwrite (just in case)
|
||||||
|
args << "-qq"; // be very quiet
|
||||||
|
args << zipFile;
|
||||||
|
args << "-d" << dir.absolutePath(); // dest dir
|
||||||
|
|
||||||
|
QProcess pr;
|
||||||
|
pr.setStandardInputFile("/dev/null");
|
||||||
|
pr.setStandardOutputFile("/dev/null");
|
||||||
|
pr.setStandardErrorFile("/dev/null");
|
||||||
|
|
||||||
|
pr.start("unzip", args);
|
||||||
|
|
||||||
|
if (pr.waitForStarted()) {
|
||||||
|
if (pr.waitForFinished()) return QLatin1String(td);
|
||||||
|
}
|
||||||
|
|
||||||
|
// cleanup
|
||||||
|
removeFilesAndDirs(dir);
|
||||||
|
dir.cd("..");
|
||||||
|
QString s = QLatin1String(strchr(td+1, '/')+1);
|
||||||
|
//qDebug() << s;
|
||||||
|
dir.rmdir(s);
|
||||||
|
|
||||||
|
return QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorThemeXP::XCursorThemeXP (const QString &aFileName) : XCursorTheme() {
|
||||||
|
QFileInfo fi(aFileName);
|
||||||
|
if (fi.exists() && fi.isReadable()) {
|
||||||
|
QString dst = unzipFile(aFileName);
|
||||||
|
if (!dst.isEmpty()) {
|
||||||
|
QDir d(dst);
|
||||||
|
if (!parseCursorXPTheme(d)) {
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
}
|
||||||
|
qDebug() << "doing cleanup...";
|
||||||
|
dst.remove(0, dst.indexOf('/', 1)+1);
|
||||||
|
removeFilesAndDirs(d);
|
||||||
|
d.cd("..");
|
||||||
|
qDebug() << dst;
|
||||||
|
d.rmdir(dst);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorThemeXP::parseCursorXPTheme (const QDir &thDir) {
|
||||||
|
qDebug() << "loading" << thDir.path();
|
||||||
|
QString ifn = findFile(thDir, "scheme.ini", true);
|
||||||
|
if (ifn.isEmpty()) return false;
|
||||||
|
qDebug() << "reading scheme:" << ifn;
|
||||||
|
//
|
||||||
|
QFile fl(ifn);
|
||||||
|
if (!fl.open(QIODevice::ReadOnly)) return false; // no scheme --> no fun!
|
||||||
|
QTextStream stream;
|
||||||
|
stream.setDevice(&fl);
|
||||||
|
stream.setCodec("UTF-8");
|
||||||
|
CursorInfo info;
|
||||||
|
QSet<QString> sectionsSeen;
|
||||||
|
bool eof = false;
|
||||||
|
do {
|
||||||
|
eof = readNextSection(stream, info);
|
||||||
|
if (info.curSection.isEmpty()) break;
|
||||||
|
/*
|
||||||
|
qDebug() << "section:" << info.curSection <<
|
||||||
|
"\n stdcr was:" << info.wasStdCur << "value:" << info.isStdCursor <<
|
||||||
|
"\n frame was:" << info.wasFrameCnt << "value:" << info.frameCnt <<
|
||||||
|
"\n delay was:" << info.wasDelay << "value:" << info.delay <<
|
||||||
|
"\n xhot was:" << info.wasXHot << "value:" << info.xhot <<
|
||||||
|
"\n yhot was:" << info.wasYHot << "value:" << info.yhot <<
|
||||||
|
"\n style was:" << info.wasAStyle << "loop:" << info.isLooped << "2way:" << info.is2way <<
|
||||||
|
"\n scrpt was:" << info.wasScript << "value:" << info.script <<
|
||||||
|
"\n next section:" << info.nextSection
|
||||||
|
;
|
||||||
|
*/
|
||||||
|
const char ** nlst = XCursorTheme::findCursorRecord(info.curSection, 0);
|
||||||
|
QString imgFile = findFile(thDir, info.curSection+".png", true);
|
||||||
|
if (!sectionsSeen.contains(info.curSection) && nlst && !imgFile.isEmpty()) {
|
||||||
|
qDebug() << "section" << info.curSection << "file:" << imgFile;
|
||||||
|
sectionsSeen << info.curSection;
|
||||||
|
//TODO: script
|
||||||
|
QList<XCursorThemeFX::tAnimSeq> aseq;
|
||||||
|
{
|
||||||
|
// create 'standard' animseq
|
||||||
|
XCursorThemeFX::tAnimSeq a;
|
||||||
|
a.from = 0; a.to = info.frameCnt-1; a.delay = info.delay;
|
||||||
|
aseq << a;
|
||||||
|
// and back if 'alternate' flag set
|
||||||
|
if (info.is2way) {
|
||||||
|
a.from = info.frameCnt-1; a.to = 0;
|
||||||
|
aseq << a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// load image
|
||||||
|
QImage img(imgFile);
|
||||||
|
if (!img.isNull()) {
|
||||||
|
XCursorImages *cim = new XCursorImages(*nlst);
|
||||||
|
quint32 frameWdt = img.width()/info.frameCnt;
|
||||||
|
qDebug() << "frameWdt:" << frameWdt << "left:" << img.width()%(frameWdt*info.frameCnt);
|
||||||
|
// now build animation sequence
|
||||||
|
int fCnt = 0;
|
||||||
|
foreach (const XCursorThemeFX::tAnimSeq &a, aseq) {
|
||||||
|
bool back = a.from > a.to; // going backwards
|
||||||
|
quint32 fNo = a.from;
|
||||||
|
for (;; fCnt++) {
|
||||||
|
//k8:qDebug() << " frame:" << fNo << "delay:" << a.delay;
|
||||||
|
// copy frame
|
||||||
|
QImage frame(img.copy(fNo*frameWdt, 0, frameWdt, img.height()));
|
||||||
|
//frame.save(QString("_png/%1_%2.png").arg(cim->name()).arg(QString::number(f)));
|
||||||
|
XCursorImage *i = new XCursorImage(QString("%1%2").arg(cim->name()).arg(QString::number(fCnt)),
|
||||||
|
frame, info.xhot, info.yhot, a.delay, 1
|
||||||
|
);
|
||||||
|
cim->append(i);
|
||||||
|
//
|
||||||
|
if (fNo == a.to) break;
|
||||||
|
if (back) fNo--; else fNo++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// append if not empty
|
||||||
|
if (cim->count()) {
|
||||||
|
// now check if it is looped and cancel looping if necessary
|
||||||
|
if (!info.isLooped) {
|
||||||
|
// not looped
|
||||||
|
qDebug() << " anti-loop fix";
|
||||||
|
XCursorImage *i = cim->item(cim->count()-1);
|
||||||
|
i->setDelay(0x7fffffffL);
|
||||||
|
//i->setCSize(2); // ???
|
||||||
|
}
|
||||||
|
mList << cim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (!eof);
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef XCRTHEMEXP_H
|
||||||
|
#define XCRTHEMEXP_H
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
#include "xcrtheme.h"
|
||||||
|
#include "xcrthemefx.h"
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorThemeXP : public XCursorTheme {
|
||||||
|
public:
|
||||||
|
XCursorThemeXP (const QString &aFileName);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool parseCursorXPTheme (const QDir &thDir);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,247 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#include <QDebug>
|
||||||
|
//#include <QtCore>
|
||||||
|
|
||||||
|
#include "xcrxcur.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QStyle>
|
||||||
|
#include <QTextCodec>
|
||||||
|
#include <QTextStream>
|
||||||
|
|
||||||
|
#include <QX11Info>
|
||||||
|
|
||||||
|
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xcursor/Xcursor.h>
|
||||||
|
#include <X11/extensions/Xfixes.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
static QImage autoCropImage (const QImage &image) {
|
||||||
|
// Compute an autocrop rectangle for the image
|
||||||
|
QRect r(image.rect().bottomRight(), image.rect().topLeft());
|
||||||
|
const quint32 *pixels = reinterpret_cast<const quint32*>(image.bits());
|
||||||
|
for (int y = 0; y < image.height(); y++) {
|
||||||
|
for (int x = 0; x < image.width(); x++) {
|
||||||
|
if (*(pixels++)) {
|
||||||
|
if (x < r.left()) r.setLeft(x);
|
||||||
|
if (x > r.right()) r.setRight(x);
|
||||||
|
if (y < r.top()) r.setTop(y);
|
||||||
|
if (y > r.bottom()) r.setBottom(y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Normalize the rectangle
|
||||||
|
return image.copy(r.normalized());
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
inline static quint32 getDW (const void *data) {
|
||||||
|
const quint8 *d = (const quint8 *)data;
|
||||||
|
d += 3;
|
||||||
|
quint32 res = 0;
|
||||||
|
for (int f = 4; f > 0; f--, d--) {
|
||||||
|
res <<= 8;
|
||||||
|
res |= *d;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static quint32 baGetDW (QByteArray &ba, int &pos) {
|
||||||
|
const uchar *d = (const uchar *)ba.constData();
|
||||||
|
d += pos+3;
|
||||||
|
pos += 4;
|
||||||
|
quint32 res = 0;
|
||||||
|
for (int f = 4; f > 0; f--, d--) {
|
||||||
|
res <<= 8;
|
||||||
|
res |= *d;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorImageXCur::XCursorImageXCur (const QString &aName, const void *aImgData) : XCursorImage(aName) {
|
||||||
|
parseImgData(aImgData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorImageXCur::~XCursorImageXCur () {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void XCursorImageXCur::parseImgData (const void *aImgData) {
|
||||||
|
mIsValid = false;
|
||||||
|
if (mImage) delete mImage; mImage = 0;
|
||||||
|
const quint32 *data = (const quint32 *)aImgData;
|
||||||
|
if (getDW(data) != 36) return; // header size
|
||||||
|
if (getDW(data+1) != 0xfffd0002L) return; // magic
|
||||||
|
//if (getDW(data+2) != 1) return; // image subtype
|
||||||
|
if (getDW(data+3) != 1) return; // version
|
||||||
|
mCSize = getDW(data+2);
|
||||||
|
data += 4;
|
||||||
|
quint32 wdt = getDW(data++); // width
|
||||||
|
quint32 hgt = getDW(data++); // height
|
||||||
|
if (wdt > 0x7fff) return;
|
||||||
|
if (hgt > 0x7fff) return;
|
||||||
|
/*
|
||||||
|
quint32 xhot = getDW(data++);
|
||||||
|
quint32 yhot = getDW(data++);
|
||||||
|
assert(xhot <= wdt);
|
||||||
|
assert(yhot <= hgt);
|
||||||
|
*/
|
||||||
|
mXHot = *((const qint32 *)data); data++;
|
||||||
|
mYHot = *((const qint32 *)data); data++;
|
||||||
|
mDelay = getDW(data++); // milliseconds
|
||||||
|
// got to pixels (ARGB)
|
||||||
|
QImage img((const uchar *)data, wdt, hgt, QImage::Format_ARGB32_Premultiplied);
|
||||||
|
mImage = new QImage(img.copy());
|
||||||
|
mIsValid = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
XCursorImagesXCur::XCursorImagesXCur (const QDir &aDir, const QString &aName) : XCursorImages(aName, aDir.path()) {
|
||||||
|
parseCursorFile(aDir.path()+"/"+aName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
XCursorImagesXCur::XCursorImagesXCur (const QString &aFileName) : XCursorImages("", "") {
|
||||||
|
QString name(aFileName);
|
||||||
|
if (name.isEmpty() || name.endsWith('/')) return;
|
||||||
|
int i = name.lastIndexOf('/');
|
||||||
|
QString dir;
|
||||||
|
if (i < 0) dir = "./"; else dir = name.left(i);
|
||||||
|
name = name.mid(i+1);
|
||||||
|
setName(name); setPath(dir);
|
||||||
|
parseCursorFile(aFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool XCursorImagesXCur::parseCursorFile (const QString &fname) {
|
||||||
|
//qDebug() << fname;
|
||||||
|
qDeleteAll(mList);
|
||||||
|
mList.clear();
|
||||||
|
QFile fl(fname);
|
||||||
|
if (!fl.open(QIODevice::ReadOnly)) return false; // shit!
|
||||||
|
QByteArray ba(fl.readAll());
|
||||||
|
fl.close();
|
||||||
|
if (ba.size() < 4*4) return false; // shit!
|
||||||
|
if (ba[0] != 'X' || ba[1] != 'c' || ba[2] != 'u' || ba[3] != 'r') return false; // shit!
|
||||||
|
//FIXME: add more checks!
|
||||||
|
int pos = 4;
|
||||||
|
quint32 hdrSize = baGetDW(ba, pos);
|
||||||
|
if (hdrSize < 16) return false; // invalid header size
|
||||||
|
quint32 version = baGetDW(ba, pos);
|
||||||
|
if (version != 65536) return false; // invalid version
|
||||||
|
quint32 ntoc = baGetDW(ba, pos);
|
||||||
|
if (!ntoc) return true; // nothing to parse
|
||||||
|
if (ntoc >= 65536) return false; // idiot or what?
|
||||||
|
quint32 tocEndOfs = hdrSize+(ntoc*(3*4));
|
||||||
|
if (tocEndOfs > (quint32)ba.size()) return false; // out of data
|
||||||
|
pos = hdrSize;
|
||||||
|
// parse TOC
|
||||||
|
int cnt = -1;
|
||||||
|
bool wasTitle = false, wasAuthor = false, wasLic = false;
|
||||||
|
bool wasMail = false, wasSite = false, wasDescr = false, wasIM = false;
|
||||||
|
while (ntoc-- > 0) {
|
||||||
|
cnt++;
|
||||||
|
quint32 type = baGetDW(ba, pos);
|
||||||
|
pos += 4; // skip the shit
|
||||||
|
quint32 dataOfs = baGetDW(ba, pos);
|
||||||
|
if (type == 0xfffd0001) {
|
||||||
|
// text
|
||||||
|
if (dataOfs < tocEndOfs || dataOfs > (quint32)ba.size()-20) continue; // invalid text
|
||||||
|
// parse text
|
||||||
|
int ipos = dataOfs;
|
||||||
|
if (baGetDW(ba, ipos) != 20) continue; // invalid header size
|
||||||
|
if (baGetDW(ba, ipos) != 0xfffd0001) continue; // invalid type
|
||||||
|
quint32 subT = baGetDW(ba, ipos);
|
||||||
|
if (baGetDW(ba, ipos) != 1) continue; // invalid version
|
||||||
|
quint32 len = baGetDW(ba, ipos);
|
||||||
|
// check for data presence
|
||||||
|
if (ipos+len > (quint32)ba.size()) continue; // out of data
|
||||||
|
QByteArray stBA(ba.mid(ipos, len));
|
||||||
|
QString s(QString::fromUtf8(stBA));
|
||||||
|
switch (subT) {
|
||||||
|
case 1: // copyright (author)
|
||||||
|
if (!wasAuthor) {
|
||||||
|
wasAuthor = true;
|
||||||
|
mAuthor = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 2: // license
|
||||||
|
if (!wasLic) {
|
||||||
|
wasLic = true;
|
||||||
|
mLicense = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: // other (description)
|
||||||
|
if (!wasDescr) {
|
||||||
|
wasDescr = true;
|
||||||
|
mDescr = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// my extensions
|
||||||
|
case 4: // title
|
||||||
|
if (!wasTitle) {
|
||||||
|
wasTitle = true;
|
||||||
|
mTitle = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5: // e-mail
|
||||||
|
if (!wasMail) {
|
||||||
|
wasMail = true;
|
||||||
|
mEMail = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 6: // site
|
||||||
|
if (!wasSite) {
|
||||||
|
wasSite = true;
|
||||||
|
mSite = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 7: // IM
|
||||||
|
if (!wasIM) {
|
||||||
|
wasIM = true;
|
||||||
|
mIM = s;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (type != 0xfffd0002) continue; // not an image, skip this one
|
||||||
|
// image
|
||||||
|
// check
|
||||||
|
if (dataOfs < tocEndOfs || dataOfs > (quint32)ba.size()-36) continue; // invalid image
|
||||||
|
// parse image
|
||||||
|
int ipos = dataOfs;
|
||||||
|
if (baGetDW(ba, ipos) != 36) continue; // invalid image (header size)
|
||||||
|
if (baGetDW(ba, ipos) != 0xfffd0002) continue; // invalid type
|
||||||
|
ipos += 4; // skip the shit
|
||||||
|
if (baGetDW(ba, ipos) != 1) continue; // invalid image (version)
|
||||||
|
quint32 wdt = baGetDW(ba, ipos);
|
||||||
|
quint32 hgt = baGetDW(ba, ipos);
|
||||||
|
if (wdt > 0x7fff || hgt > 0x7fff) continue; // invalid sizes
|
||||||
|
// check for data presence
|
||||||
|
if ((ipos+3*4)+(wdt*hgt*4) > (quint32)ba.size()) continue; // out of data
|
||||||
|
// load image
|
||||||
|
const uchar *dta = (const uchar *)ba.constData();
|
||||||
|
dta += dataOfs;
|
||||||
|
XCursorImage *img = new XCursorImageXCur(mName+"_"+QString::number(cnt), dta);
|
||||||
|
if (img->isValid()) mList << img; else delete img;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
/* coded by Ketmar // Vampire Avalon (psyc://ketmar.no-ip.org/~Ketmar)
|
||||||
|
* (c)DWTFYW
|
||||||
|
*
|
||||||
|
* This program is free software. It comes without any warranty, to
|
||||||
|
* the extent permitted by applicable law. You can redistribute it
|
||||||
|
* and/or modify it under the terms of the Do What The Fuck You Want
|
||||||
|
* To Public License, Version 2, as published by Sam Hocevar. See
|
||||||
|
* http://sam.zoy.org/wtfpl/COPYING for more details.
|
||||||
|
*/
|
||||||
|
#ifndef XCRXCUR_H
|
||||||
|
#define XCRXCUR_H
|
||||||
|
|
||||||
|
#include <QtCore>
|
||||||
|
#include <QCursor>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
#include "xcrimg.h"
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorImageXCur : public XCursorImage {
|
||||||
|
public:
|
||||||
|
XCursorImageXCur (const QString &aName, const void *aImgData); // create from Xcursor file contents (ptr to image)
|
||||||
|
virtual ~XCursorImageXCur ();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void parseImgData (const void *aImgData);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class XCursorImagesXCur : public XCursorImages {
|
||||||
|
public:
|
||||||
|
XCursorImagesXCur (const QDir &aDir, const QString &aName);
|
||||||
|
XCursorImagesXCur (const QString &aFileName);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool parseCursorFile (const QString &fname);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,88 @@
|
|||||||
|
project(lxqt-config-appearance)
|
||||||
|
|
||||||
|
include_directories(
|
||||||
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||||
|
${LXQT_INCLUDE_DIRS}
|
||||||
|
${QTXDG_INCLUDE_DIRS}
|
||||||
|
"${CMAKE_SOURCE_DIR}/liblxqt-config-cursor"
|
||||||
|
"${CMAKE_BINARY_DIR}/liblxqt-config-cursor"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(H_FILES
|
||||||
|
iconthemeinfo.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(MOC_FILES
|
||||||
|
iconthemeconfig.h
|
||||||
|
lxqtthemeconfig.h
|
||||||
|
fontsconfig.h
|
||||||
|
styleconfig.h
|
||||||
|
fontconfigfile.h
|
||||||
|
)
|
||||||
|
|
||||||
|
set(CPP_FILES
|
||||||
|
main.cpp
|
||||||
|
iconthemeconfig.cpp
|
||||||
|
iconthemeinfo.cpp
|
||||||
|
lxqtthemeconfig.cpp
|
||||||
|
fontsconfig.cpp
|
||||||
|
styleconfig.cpp
|
||||||
|
fontconfigfile.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(UI_FILES
|
||||||
|
iconthemeconfig.ui
|
||||||
|
lxqtthemeconfig.ui
|
||||||
|
fontsconfig.ui
|
||||||
|
styleconfig.ui
|
||||||
|
)
|
||||||
|
|
||||||
|
set(QRC_FILES "")
|
||||||
|
|
||||||
|
set(LIBRARIES
|
||||||
|
${QTXDG_LIBRARIES}
|
||||||
|
${LXQT_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Translations **********************************
|
||||||
|
lxqt_translate_ts(QM_FILES
|
||||||
|
UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS}
|
||||||
|
SOURCES
|
||||||
|
${H_FILES}
|
||||||
|
${CPP_FILES}
|
||||||
|
${UI_FILES}
|
||||||
|
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)
|
||||||
|
|
||||||
|
#************************************************
|
||||||
|
|
||||||
|
qt5_wrap_ui(UI_HEADERS ${UI_FILES})
|
||||||
|
qt5_add_resources(QRC_SOURCES ${QRC_FILES})
|
||||||
|
|
||||||
|
add_executable(${PROJECT_NAME}
|
||||||
|
${CPP_FILES}
|
||||||
|
${UI_FILES}
|
||||||
|
${RESOURCES}
|
||||||
|
${QRC_SOURCES}
|
||||||
|
${QM_FILES}
|
||||||
|
${QM_LOADER}
|
||||||
|
${MOC_SOURCES}
|
||||||
|
${DESKTOP_FILES}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(${PROJECT_NAME}
|
||||||
|
KF5::WindowSystem
|
||||||
|
Qt5::Widgets
|
||||||
|
Qt5::X11Extras
|
||||||
|
Qt5::Xml
|
||||||
|
${LIBRARIES}
|
||||||
|
lxqt-config-cursor
|
||||||
|
)
|
||||||
|
|
||||||
|
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
|
||||||
|
install(FILES ${DESKTOP_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
|
@ -0,0 +1,235 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||||
|
* LXQt project: http://lxde.org/
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "fontconfigfile.h"
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
#include <QDomDocument>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
|
||||||
|
FontConfigFile::FontConfigFile(QObject* parent):
|
||||||
|
QObject(parent),
|
||||||
|
mAntialias(true),
|
||||||
|
mHinting(true),
|
||||||
|
mSubpixel("rgb"),
|
||||||
|
mHintStyle("hintslight"),
|
||||||
|
mDpi(96),
|
||||||
|
mAutohint(false),
|
||||||
|
mSaveTimer(NULL)
|
||||||
|
{
|
||||||
|
mDirPath = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME"));
|
||||||
|
QString homeDir = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
|
||||||
|
if(mDirPath.isEmpty())
|
||||||
|
mDirPath = homeDir % "/.config";
|
||||||
|
mDirPath += "/fontconfig";
|
||||||
|
mFilePath = mDirPath + "/fonts.conf";
|
||||||
|
|
||||||
|
load();
|
||||||
|
}
|
||||||
|
|
||||||
|
FontConfigFile::~FontConfigFile()
|
||||||
|
{
|
||||||
|
if(mSaveTimer) // has pending save request
|
||||||
|
{
|
||||||
|
delete mSaveTimer;
|
||||||
|
mSaveTimer = NULL;
|
||||||
|
save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setAntialias(bool value)
|
||||||
|
{
|
||||||
|
mAntialias = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setSubpixel(QByteArray value)
|
||||||
|
{
|
||||||
|
mSubpixel = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setHinting(bool value)
|
||||||
|
{
|
||||||
|
mHinting = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setHintStyle(QByteArray value)
|
||||||
|
{
|
||||||
|
mHintStyle = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setDpi(int value)
|
||||||
|
{
|
||||||
|
mDpi = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::setAutohint(bool value)
|
||||||
|
{
|
||||||
|
mAutohint = value;
|
||||||
|
queueSave();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::load()
|
||||||
|
{
|
||||||
|
QFile file(mFilePath);
|
||||||
|
if(file.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
QByteArray buffer = file.readAll();
|
||||||
|
file.close();
|
||||||
|
if(buffer.contains("lxqt-config-appearance")) // the config file is created by us
|
||||||
|
{
|
||||||
|
// doing full xml parsing is over-kill. let's use some simpler brute-force methods.
|
||||||
|
QDomDocument doc;
|
||||||
|
doc.setContent(&file);
|
||||||
|
file.close();
|
||||||
|
QDomElement docElem = doc.documentElement();
|
||||||
|
QDomNodeList editNodes = docElem.elementsByTagName("edit");
|
||||||
|
for(int i = 0; i < editNodes.count(); ++i)
|
||||||
|
{
|
||||||
|
QDomElement editElem = editNodes.at(i).toElement();
|
||||||
|
QByteArray name = editElem.attribute("name").toLatin1();
|
||||||
|
if(name == "antialias")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("bool").text();
|
||||||
|
mAntialias = value[0] == 't' ? true : false;
|
||||||
|
}
|
||||||
|
else if(name == "rgba")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("const").text();
|
||||||
|
mSubpixel = value.toLatin1();
|
||||||
|
}
|
||||||
|
else if(name == "hinting")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("bool").text();
|
||||||
|
mHinting = value[0] == 't' ? true : false;
|
||||||
|
}
|
||||||
|
else if(name == "hintstyle")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("const").text();
|
||||||
|
mHintStyle = value.toLatin1();
|
||||||
|
}
|
||||||
|
else if(name == "dpi")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("double").text();
|
||||||
|
mDpi = value.toInt();
|
||||||
|
}
|
||||||
|
else if(name == "autohint")
|
||||||
|
{
|
||||||
|
QString value = editElem.firstChildElement("bool").text();
|
||||||
|
mAutohint = value[0] == 't' ? true : false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // the config file is created by others => make a backup and write our config
|
||||||
|
{
|
||||||
|
QFile backup(mFilePath + ".bak");
|
||||||
|
if(backup.open(QIODevice::WriteOnly))
|
||||||
|
{
|
||||||
|
backup.write(buffer);
|
||||||
|
backup.close();
|
||||||
|
}
|
||||||
|
queueSave(); // overwrite with our file
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::save()
|
||||||
|
{
|
||||||
|
if(mSaveTimer)
|
||||||
|
{
|
||||||
|
mSaveTimer->deleteLater();
|
||||||
|
mSaveTimer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile file(mFilePath);
|
||||||
|
QDir().mkdir(mDirPath);
|
||||||
|
// References: https://wiki.archlinux.org/index.php/Font_Configuration
|
||||||
|
if(file.open(QIODevice::WriteOnly))
|
||||||
|
{
|
||||||
|
QTextStream s(&file);
|
||||||
|
s <<
|
||||||
|
"<?xml version=\"1.0\"?>\n"
|
||||||
|
"<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">\n"
|
||||||
|
"<!-- created by lxqt-config-appearance (DO NOT EDIT!) -->\n"
|
||||||
|
"<fontconfig>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"antialias\" mode=\"assign\">\n"
|
||||||
|
" <bool>" << (mAntialias ? "true" : "false") << "</bool>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"rgba\" mode=\"assign\">\n"
|
||||||
|
" <const>" << mSubpixel << "</const>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"lcdfilter\" mode=\"assign\">\n"
|
||||||
|
" <const>lcddefault</const>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"hinting\" mode=\"assign\">\n"
|
||||||
|
" <bool>" << (mHinting ? "true" : "false") << "</bool>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"hintstyle\" mode=\"assign\">\n"
|
||||||
|
" <const>" << mHintStyle << "</const>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"font\">\n"
|
||||||
|
" <edit name=\"autohint\" mode=\"assign\">\n"
|
||||||
|
" <bool>" << (mAutohint ? "true" : "false") << "</bool>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
" <match target=\"pattern\">\n"
|
||||||
|
" <edit name=\"dpi\" mode=\"assign\">\n"
|
||||||
|
" <double>" << mDpi << "</double>\n"
|
||||||
|
" </edit>\n"
|
||||||
|
" </match>\n"
|
||||||
|
"</fontconfig>";
|
||||||
|
s.flush();
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontConfigFile::queueSave()
|
||||||
|
{
|
||||||
|
if(mSaveTimer)
|
||||||
|
mSaveTimer->start(1500);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mSaveTimer = new QTimer();
|
||||||
|
mSaveTimer->setSingleShot(true);
|
||||||
|
connect(mSaveTimer, SIGNAL(timeout()), this, SLOT(save()));
|
||||||
|
mSaveTimer->start(1500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||||
|
* LXQt project: http://lxde.org/
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FONTCONFIGFILE_H
|
||||||
|
#define FONTCONFIGFILE_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class QTimer;
|
||||||
|
|
||||||
|
class FontConfigFile: public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit FontConfigFile(QObject* parent = 0);
|
||||||
|
virtual ~FontConfigFile();
|
||||||
|
|
||||||
|
bool antialias() const {
|
||||||
|
return mAntialias;
|
||||||
|
}
|
||||||
|
void setAntialias(bool value);
|
||||||
|
|
||||||
|
bool hinting() const {
|
||||||
|
return mHinting;
|
||||||
|
}
|
||||||
|
void setHinting(bool value);
|
||||||
|
|
||||||
|
QByteArray subpixel() const {
|
||||||
|
return mSubpixel;
|
||||||
|
}
|
||||||
|
void setSubpixel(QByteArray value);
|
||||||
|
|
||||||
|
QByteArray hintStyle() const {
|
||||||
|
return mHintStyle;
|
||||||
|
}
|
||||||
|
void setHintStyle(QByteArray value);
|
||||||
|
|
||||||
|
int dpi() const {
|
||||||
|
return mDpi;
|
||||||
|
}
|
||||||
|
void setDpi(int value);
|
||||||
|
|
||||||
|
bool autohint() const {
|
||||||
|
return mAutohint;
|
||||||
|
}
|
||||||
|
void setAutohint(bool value);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void save();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void load();
|
||||||
|
void queueSave();
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mAntialias;
|
||||||
|
bool mHinting;
|
||||||
|
QByteArray mSubpixel;
|
||||||
|
QByteArray mHintStyle;
|
||||||
|
int mDpi;
|
||||||
|
bool mAutohint;
|
||||||
|
QString mDirPath;
|
||||||
|
QString mFilePath;
|
||||||
|
QTimer* mSaveTimer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FONTCONFIGFILE_H
|
@ -0,0 +1,196 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://lxde.org/
|
||||||
|
*
|
||||||
|
* Copyright: 2014 LXQt team
|
||||||
|
* Authors:
|
||||||
|
* Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include "fontsconfig.h"
|
||||||
|
#include "ui_fontsconfig.h"
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QFont>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <QStringBuilder>
|
||||||
|
#include <QDomDocument>
|
||||||
|
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
extern void qt_x11_apply_settings_in_all_apps();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static const char* subpixelNames[] = {"none", "rgb", "bgr", "vrgb", "vbgr"};
|
||||||
|
static const char* hintStyleNames[] = {"hintnone", "hintslight", "hintmedium", "hintfull"};
|
||||||
|
|
||||||
|
FontsConfig::FontsConfig(LxQt::Settings* settings, QSettings* qtSettings, QWidget* parent) :
|
||||||
|
QWidget(parent),
|
||||||
|
ui(new Ui::FontsConfig),
|
||||||
|
mSettings(settings),
|
||||||
|
mQtSettings(qtSettings),
|
||||||
|
mFontConfigFile()
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
initControls();
|
||||||
|
|
||||||
|
connect(ui->fontName, SIGNAL(currentFontChanged(QFont)), SLOT(updateQtFont()));
|
||||||
|
connect(ui->fontStyle, SIGNAL(currentIndexChanged(int)), SLOT(updateQtFont()));
|
||||||
|
connect(ui->fontSize, SIGNAL(valueChanged(int)), SLOT(updateQtFont()));
|
||||||
|
|
||||||
|
connect(ui->antialias, SIGNAL(toggled(bool)), SLOT(antialiasToggled(bool)));
|
||||||
|
connect(ui->subpixel, SIGNAL(currentIndexChanged(int)), SLOT(subpixelChanged(int)));
|
||||||
|
connect(ui->hinting, SIGNAL(toggled(bool)), SLOT(hintingToggled(bool)));
|
||||||
|
connect(ui->hintStyle, SIGNAL(currentIndexChanged(int)), SLOT(hintStyleChanged(int)));
|
||||||
|
connect(ui->dpi, SIGNAL(valueChanged(int)), SLOT(dpiChanged(int)));
|
||||||
|
connect(ui->autohint, SIGNAL(toggled(bool)), SLOT(autohintToggled(bool)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
FontsConfig::~FontsConfig()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void FontsConfig::initControls()
|
||||||
|
{
|
||||||
|
// read Qt style settings from Qt Trolltech.conf config
|
||||||
|
mQtSettings->beginGroup(QLatin1String("Qt"));
|
||||||
|
|
||||||
|
QString fontName = mQtSettings->value("font").toString();
|
||||||
|
QFont font;
|
||||||
|
font.fromString(fontName);
|
||||||
|
ui->fontName->setCurrentFont(font);
|
||||||
|
ui->fontSize->setValue(font.pointSize());
|
||||||
|
int fontStyle = 0;
|
||||||
|
if(font.bold())
|
||||||
|
fontStyle = font.italic() ? 3 : 1;
|
||||||
|
else if(font.italic())
|
||||||
|
fontStyle = 2;
|
||||||
|
ui->fontStyle->setCurrentIndex(fontStyle);
|
||||||
|
|
||||||
|
mQtSettings->endGroup();
|
||||||
|
|
||||||
|
// load fontconfig config
|
||||||
|
ui->antialias->setChecked(mFontConfigFile.antialias());
|
||||||
|
ui->autohint->setChecked(mFontConfigFile.autohint());
|
||||||
|
|
||||||
|
QByteArray subpixelStr = mFontConfigFile.subpixel();
|
||||||
|
int subpixel;
|
||||||
|
for(subpixel = 0; subpixel < 5; ++subpixel)
|
||||||
|
{
|
||||||
|
if(subpixelStr == subpixelNames[subpixel])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(subpixel < 5)
|
||||||
|
ui->subpixel->setCurrentIndex(subpixel);
|
||||||
|
|
||||||
|
ui->hinting->setChecked(mFontConfigFile.hinting());
|
||||||
|
|
||||||
|
QByteArray hintStyleStr = mFontConfigFile.hintStyle();
|
||||||
|
int hintStyle;
|
||||||
|
for(hintStyle = 0; hintStyle < 4; ++hintStyle)
|
||||||
|
{
|
||||||
|
if(hintStyleStr == hintStyleNames[hintStyle])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(hintStyle < 4)
|
||||||
|
ui->hintStyle->setCurrentIndex(hintStyle);
|
||||||
|
|
||||||
|
int dpi = mFontConfigFile.dpi();
|
||||||
|
ui->dpi->setValue(dpi);
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::antialiasToggled(bool toggled)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setAntialias(toggled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::dpiChanged(int value)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setDpi(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::hintingToggled(bool toggled)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setHinting(toggled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::subpixelChanged(int index)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setSubpixel(subpixelNames[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::hintStyleChanged(int index)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setHintStyle(hintStyleNames[index]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::autohintToggled(bool toggled)
|
||||||
|
{
|
||||||
|
mFontConfigFile.setAutohint(toggled);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FontsConfig::updateQtFont()
|
||||||
|
{
|
||||||
|
// FIXME: the change does not apply to some currently running Qt programs.
|
||||||
|
// FIXME: does not work with KDE apps
|
||||||
|
// TODO: also write the config values to GTK+ config files (gtk-2.0.rc and gtk3/settings.ini)
|
||||||
|
// FIXME: the selected font does not apply to our own application. Why?
|
||||||
|
|
||||||
|
QFont font = ui->fontName->currentFont();
|
||||||
|
int size = ui->fontSize->value();
|
||||||
|
bool bold = false;
|
||||||
|
bool italic = false;
|
||||||
|
switch(ui->fontStyle->currentIndex())
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
bold = true;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
italic = true;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
bold = italic = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
font.setPointSize(size);
|
||||||
|
font.setBold(bold);
|
||||||
|
font.setItalic(italic);
|
||||||
|
|
||||||
|
mQtSettings->beginGroup(QLatin1String("Qt"));
|
||||||
|
mQtSettings->setValue("font", font.toString());
|
||||||
|
mQtSettings->endGroup();
|
||||||
|
mQtSettings->sync();
|
||||||
|
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
qt_x11_apply_settings_in_all_apps();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef FONTSCONFIG_H
|
||||||
|
#define FONTSCONFIG_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QFont>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
#include "fontconfigfile.h"
|
||||||
|
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
class QSettings;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class FontsConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
class FontsConfig : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit FontsConfig(LxQt::Settings *settings, QSettings *qtSettings, QWidget *parent = 0);
|
||||||
|
~FontsConfig();
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void initControls();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void updateQtFont();
|
||||||
|
void antialiasToggled(bool toggled);
|
||||||
|
void hintingToggled(bool toggled);
|
||||||
|
void subpixelChanged(int index);
|
||||||
|
void hintStyleChanged(int index);
|
||||||
|
void dpiChanged(int value);
|
||||||
|
void autohintToggled(bool toggled);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::FontsConfig *ui;
|
||||||
|
QSettings *mQtSettings;
|
||||||
|
LxQt::Settings *mSettings;
|
||||||
|
FontConfigFile mFontConfigFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FONTSCONFIG_H
|
@ -0,0 +1,257 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>FontsConfig</class>
|
||||||
|
<widget class="QWidget" name="FontsConfig">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>421</width>
|
||||||
|
<height>379</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Font</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Default font for user interface</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_3">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Font name:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QFontComboBox" name="fontName"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_6">
|
||||||
|
<property name="text">
|
||||||
|
<string>Style:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_7">
|
||||||
|
<property name="text">
|
||||||
|
<string>Point size:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QSpinBox" name="fontSize"/>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="fontStyle">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Normal</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Bold</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Italic</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Bold Italic</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="xftSettings">
|
||||||
|
<property name="title">
|
||||||
|
<string>The following settings only affect newly started applications</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout_2">
|
||||||
|
<item row="0" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="antialias">
|
||||||
|
<property name="text">
|
||||||
|
<string>Use antialias fonts</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="text">
|
||||||
|
<string>Font hinting style:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QComboBox" name="hintStyle">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Slight</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Medium</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Full</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="hinting">
|
||||||
|
<property name="text">
|
||||||
|
<string>Font hinting</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QLabel" name="label_5">
|
||||||
|
<property name="text">
|
||||||
|
<string>Resolution (DPI):</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="6" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="autohint">
|
||||||
|
<property name="text">
|
||||||
|
<string>Autohint</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QSpinBox" name="dpi">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>-1</number>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>1048576</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QLabel" name="label_4">
|
||||||
|
<property name="text">
|
||||||
|
<string>Subpixel antialiasing:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QComboBox" name="subpixel">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>None</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>RGB</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>BGR</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>VRGB</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>VBGR</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>antialias</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>subpixel</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>225</x>
|
||||||
|
<y>109</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>298</x>
|
||||||
|
<y>140</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>hinting</sender>
|
||||||
|
<signal>toggled(bool)</signal>
|
||||||
|
<receiver>hintStyle</receiver>
|
||||||
|
<slot>setEnabled(bool)</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>225</x>
|
||||||
|
<y>171</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>298</x>
|
||||||
|
<y>202</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
@ -0,0 +1,133 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2011 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Petr Vanek <petr@scribus.info>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include "iconthemeconfig.h"
|
||||||
|
|
||||||
|
#include <XdgDesktopFile>
|
||||||
|
#include <XdgIcon>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QIcon>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
|
||||||
|
IconThemeConfig::IconThemeConfig(LxQt::Settings* settings, QWidget* parent):
|
||||||
|
QWidget(parent),
|
||||||
|
m_settings(settings)
|
||||||
|
{
|
||||||
|
setupUi(this);
|
||||||
|
|
||||||
|
initIconsThemes();
|
||||||
|
initControls();
|
||||||
|
connect(iconThemeList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
|
||||||
|
this, SLOT(iconThemeSelected(QTreeWidgetItem*,int)));
|
||||||
|
|
||||||
|
connect(LxQt::Settings::globalSettings(), SIGNAL(settingsChanged()),
|
||||||
|
this, SLOT(update()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IconThemeConfig::initIconsThemes()
|
||||||
|
{
|
||||||
|
QStringList processed;
|
||||||
|
QStringList baseDirs = QIcon::themeSearchPaths();
|
||||||
|
|
||||||
|
foreach (QString baseDirName, baseDirs)
|
||||||
|
{
|
||||||
|
QDir baseDir(baseDirName);
|
||||||
|
if (!baseDir.exists())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QFileInfoList dirs = baseDir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name);
|
||||||
|
foreach (QFileInfo dir, dirs)
|
||||||
|
{
|
||||||
|
if (!processed.contains(dir.canonicalFilePath()))
|
||||||
|
{
|
||||||
|
processed << dir.canonicalFilePath();
|
||||||
|
|
||||||
|
IconThemeInfo theme(QDir(dir.canonicalFilePath()));
|
||||||
|
if (theme.isValid() && (!theme.isHidden()))
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = new QTreeWidgetItem(iconThemeList);
|
||||||
|
item->setSizeHint(0, QSize(42,42)); // make icons non-cropped
|
||||||
|
item->setData(0, Qt::UserRole, theme.name());
|
||||||
|
|
||||||
|
item->setIcon(0, theme.icon("document-open"));
|
||||||
|
item->setIcon(1, theme.icon("document-new"));
|
||||||
|
item->setIcon(2, theme.icon("edit-undo"));
|
||||||
|
item->setIcon(3, theme.icon("media-playback-start"));
|
||||||
|
|
||||||
|
item->setText(4, theme.comment().isEmpty() ? theme.text() : theme.text() + " (" + theme.comment() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iconThemeList->setColumnCount(5);
|
||||||
|
for (int i=0; i<iconThemeList->header()->count()-1; ++i)
|
||||||
|
{
|
||||||
|
iconThemeList->resizeColumnToContents(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IconThemeConfig::initControls()
|
||||||
|
{
|
||||||
|
QString currentTheme = LxQt::Settings::globalSettings()->value("icon_theme").toString();
|
||||||
|
XdgIcon::setThemeName(currentTheme);
|
||||||
|
QTreeWidgetItemIterator it(iconThemeList);
|
||||||
|
while (*it) {
|
||||||
|
if ((*it)->data(0, Qt::UserRole).toString() == currentTheme)
|
||||||
|
{
|
||||||
|
iconThemeList->setCurrentItem((*it));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
IconThemeConfig::~IconThemeConfig()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IconThemeConfig::iconThemeSelected(QTreeWidgetItem *item, int column)
|
||||||
|
{
|
||||||
|
Q_UNUSED(column);
|
||||||
|
QString theme = item->data(0, Qt::UserRole).toString();
|
||||||
|
if (!theme.isEmpty())
|
||||||
|
{
|
||||||
|
XdgIcon::setThemeName(theme);
|
||||||
|
m_settings->setValue("icon_theme", theme);
|
||||||
|
m_settings->sync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2011 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Petr Vanek <petr@scribus.info>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include "ui_iconthemeconfig.h"
|
||||||
|
#include "iconthemeinfo.h"
|
||||||
|
|
||||||
|
namespace LxQt {
|
||||||
|
class Settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class IconThemeConfig : public QWidget, public Ui::IconThemeConfig
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
IconThemeConfig(LxQt::Settings *settings, QWidget *parent = 0);
|
||||||
|
~IconThemeConfig();
|
||||||
|
|
||||||
|
private:
|
||||||
|
LxQt::Settings *m_settings;
|
||||||
|
void initIconsThemes();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void initControls();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void iconThemeSelected(QTreeWidgetItem *item, int column);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,88 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>IconThemeConfig</class>
|
||||||
|
<widget class="QWidget" name="IconThemeConfig">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>450</width>
|
||||||
|
<height>327</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>LXQt Appearance Configuration</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Icons Theme</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTreeWidget" name="iconThemeList">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="horizontalScrollBarPolicy">
|
||||||
|
<enum>Qt::ScrollBarAlwaysOff</enum>
|
||||||
|
</property>
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>22</width>
|
||||||
|
<height>22</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="uniformRowHeights">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="columnCount">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
|
<attribute name="headerVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">1</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">2</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">3</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">4</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -0,0 +1,105 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* https://sourceforge.net/projects/lxde-qt/
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2011 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include "iconthemeinfo.h"
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
|
||||||
|
#define PRIVIEW_ICON_SIZE 22
|
||||||
|
|
||||||
|
|
||||||
|
IconThemeInfo::IconThemeInfo(const QDir &dir):
|
||||||
|
mValid(false),
|
||||||
|
mHidden(false)
|
||||||
|
{
|
||||||
|
mName = dir.dirName();
|
||||||
|
if (dir.exists("index.theme"))
|
||||||
|
load(dir.absoluteFilePath("index.theme"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IconThemeInfo::load(const QString &fileName)
|
||||||
|
{
|
||||||
|
mFileName = fileName;
|
||||||
|
mValid = false;
|
||||||
|
QSettings file(mFileName, QSettings::IniFormat);
|
||||||
|
if (file.status() != QSettings::NoError)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (file.value("Icon Theme/Directories").toStringList().join("").isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
mHidden = file.value("Icon Theme/Hidden", false).toBool();
|
||||||
|
mText = file.value("Icon Theme/Name").toString();
|
||||||
|
mComment = file.value("Icon Theme/Comment").toString();
|
||||||
|
mValid = true;
|
||||||
|
loadDirsInfo(file, QFileInfo(mFileName).dir().canonicalPath());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void IconThemeInfo::loadDirsInfo(QSettings &file, const QString &path)
|
||||||
|
{
|
||||||
|
foreach (QString i, file.value("Icon Theme/Directories", QStringList()).toStringList())
|
||||||
|
{
|
||||||
|
file.beginGroup(i);
|
||||||
|
if (file.value("Size", 0).toInt() == PRIVIEW_ICON_SIZE &&
|
||||||
|
file.value("Context").toString() == "Actions"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
mActionsDir = path + QDir::separator() + i;
|
||||||
|
file.endGroup();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
file.endGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QIcon IconThemeInfo::icon(const QString &iconName) const
|
||||||
|
{
|
||||||
|
QDir dir(mActionsDir);
|
||||||
|
|
||||||
|
if (dir.exists(iconName + ".png"))
|
||||||
|
{
|
||||||
|
QIcon icon(mActionsDir + QDir::separator() + iconName + ".png");
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir.exists(iconName + ".svg"))
|
||||||
|
{
|
||||||
|
QIcon icon(mActionsDir + QDir::separator() + iconName + ".svg");
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dir.exists(iconName + ".xpm"))
|
||||||
|
{
|
||||||
|
QIcon icon(mActionsDir + QDir::separator() + iconName + ".xpm");
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QIcon();
|
||||||
|
}
|
@ -0,0 +1,64 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* https://sourceforge.net/projects/lxde-qt/
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2011 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef ICONTHEMEINFO_H
|
||||||
|
#define ICONTHEMEINFO_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QIcon>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
|
class IconThemeInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IconThemeInfo(const QDir &dir);
|
||||||
|
|
||||||
|
QString fileName() const { return mFileName; }
|
||||||
|
QString name() const { return mName; }
|
||||||
|
QString text() const { return mText; }
|
||||||
|
QString comment() const { return mComment; }
|
||||||
|
|
||||||
|
bool isValid() const { return mValid; }
|
||||||
|
bool isHidden() const { return mHidden; }
|
||||||
|
QIcon icon(const QString &iconName) const;
|
||||||
|
private:
|
||||||
|
QString mFileName;
|
||||||
|
QString mName;
|
||||||
|
QString mText;
|
||||||
|
QString mComment;
|
||||||
|
QString mActionsDir;
|
||||||
|
|
||||||
|
bool mValid;
|
||||||
|
bool mHidden;
|
||||||
|
|
||||||
|
void load(const QString &fileName);
|
||||||
|
void loadDirsInfo(QSettings &file, const QString &path);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // ICONTHEMEINFO_H
|
@ -0,0 +1,11 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Appearance
|
||||||
|
GenericName=Appearance settings
|
||||||
|
Comment=Appearance settings for LXQt
|
||||||
|
Exec=lxqt-config-appearance
|
||||||
|
Icon=preferences-desktop-theme
|
||||||
|
Categories=Settings;DesktopSettings;Qt;LXQt;
|
||||||
|
OnlyShowIn=LXDE;LXQt;
|
||||||
|
|
||||||
|
#TRANSLATIONS_DIR=translations
|
@ -0,0 +1,109 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include "lxqtthemeconfig.h"
|
||||||
|
#include "ui_lxqtthemeconfig.h"
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QProcess>
|
||||||
|
|
||||||
|
LxQtThemeConfig::LxQtThemeConfig(LxQt::Settings *settings, QWidget *parent) :
|
||||||
|
QWidget(parent),
|
||||||
|
ui(new Ui::LxQtThemeConfig),
|
||||||
|
mSettings(settings)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
connect(ui->lxqtThemeList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
|
||||||
|
this, SLOT(lxqtThemeSelected(QTreeWidgetItem*,int)));
|
||||||
|
|
||||||
|
|
||||||
|
QList<LxQt::LxQtTheme> themes = LxQt::LxQtTheme::allThemes();
|
||||||
|
foreach(LxQt::LxQtTheme theme, themes)
|
||||||
|
{
|
||||||
|
QString themeName = theme.name();
|
||||||
|
themeName[0] = themeName[0].toTitleCase();
|
||||||
|
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(themeName));
|
||||||
|
if (!theme.previewImage().isEmpty())
|
||||||
|
{
|
||||||
|
item->setIcon(0, QIcon(theme.previewImage()));
|
||||||
|
}
|
||||||
|
item->setSizeHint(0, QSize(42,42)); // make icons non-cropped
|
||||||
|
item->setData(0, Qt::UserRole, theme.name());
|
||||||
|
ui->lxqtThemeList->addTopLevelItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
initControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LxQtThemeConfig::~LxQtThemeConfig()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LxQtThemeConfig::initControls()
|
||||||
|
{
|
||||||
|
QString currentTheme = mSettings->value("theme").toString();
|
||||||
|
|
||||||
|
QTreeWidgetItemIterator it(ui->lxqtThemeList);
|
||||||
|
while (*it) {
|
||||||
|
if ((*it)->data(0, Qt::UserRole).toString() == currentTheme)
|
||||||
|
{
|
||||||
|
ui->lxqtThemeList->setCurrentItem((*it));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void LxQtThemeConfig::lxqtThemeSelected(QTreeWidgetItem* item, int column)
|
||||||
|
{
|
||||||
|
Q_UNUSED(column);
|
||||||
|
if (!item)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QVariant themeName = item->data(0, Qt::UserRole);
|
||||||
|
mSettings->setValue("theme", themeName);
|
||||||
|
|
||||||
|
LxQt::LxQtTheme theme(themeName.toString());
|
||||||
|
if(theme.isValid()) {
|
||||||
|
QString wallpaper = theme.desktopBackground();
|
||||||
|
if(!wallpaper.isEmpty()) {
|
||||||
|
// call pcmanfm-qt to update wallpaper
|
||||||
|
QProcess process;
|
||||||
|
QStringList args;
|
||||||
|
args << "--set-wallpaper" << wallpaper;
|
||||||
|
process.start("pcmanfm-qt", args, QIODevice::NotOpen);
|
||||||
|
process.waitForFinished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef LXQTTHEMECONFIG_H
|
||||||
|
#define LXQTTHEMECONFIG_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class LxQtThemeConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
class LxQtThemeConfig : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit LxQtThemeConfig(LxQt::Settings *settings, QWidget *parent = 0);
|
||||||
|
~LxQtThemeConfig();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void initControls();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void lxqtThemeSelected(QTreeWidgetItem* item, int column);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::LxQtThemeConfig *ui;
|
||||||
|
LxQt::Settings *mSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LXQTTHEMECONFIG_H
|
@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>LxQtThemeConfig</class>
|
||||||
|
<widget class="QWidget" name="LXQtThemeConfig">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>LXQt Theme</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTreeWidget" name="lxqtThemeList">
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>100</width>
|
||||||
|
<height>32</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="uniformRowHeights">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="headerVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">1</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -0,0 +1,76 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2010-2011 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Petr Vanek <petr@scribus.info>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include <LXQt/SingleApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include <XdgIcon>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
#include <LXQt/ConfigDialog>
|
||||||
|
#include "iconthemeconfig.h"
|
||||||
|
#include "lxqtthemeconfig.h"
|
||||||
|
#include "styleconfig.h"
|
||||||
|
#include "fontsconfig.h"
|
||||||
|
|
||||||
|
#include "../liblxqt-config-cursor/selectwnd.h"
|
||||||
|
|
||||||
|
int main (int argc, char **argv)
|
||||||
|
{
|
||||||
|
LxQt::SingleApplication app(argc, argv);
|
||||||
|
LxQt::Settings* settings = new LxQt::Settings("lxqt");
|
||||||
|
LxQt::ConfigDialog* dialog = new LxQt::ConfigDialog(QObject::tr("LXQt Appearance Configuration"), settings);
|
||||||
|
|
||||||
|
app.setActivationWindow(dialog);
|
||||||
|
|
||||||
|
QSettings& qtSettings = *settings; // use lxqt config file for Qt settings in Qt5.
|
||||||
|
StyleConfig* stylePage = new StyleConfig(settings, &qtSettings, dialog);
|
||||||
|
dialog->addPage(stylePage, QObject::tr("Widget Style"), QStringList() << "preferences-desktop-theme" << "preferences-desktop");
|
||||||
|
QObject::connect(dialog, SIGNAL(reset()), stylePage, SLOT(initControls()));
|
||||||
|
|
||||||
|
IconThemeConfig* iconPage = new IconThemeConfig(settings, dialog);
|
||||||
|
dialog->addPage(iconPage, QObject::tr("Icons Theme"), QStringList() << "preferences-desktop-icons" << "preferences-desktop");
|
||||||
|
QObject::connect(dialog, SIGNAL(reset()), iconPage, SLOT(initControls()));
|
||||||
|
|
||||||
|
LxQtThemeConfig* themePage = new LxQtThemeConfig(settings, dialog);
|
||||||
|
dialog->addPage(themePage, QObject::tr("LXQt Theme"), QStringList() << "preferences-desktop-color" << "preferences-desktop");
|
||||||
|
QObject::connect(dialog, SIGNAL(reset()), themePage, SLOT(initControls()));
|
||||||
|
|
||||||
|
FontsConfig* fontsPage = new FontsConfig(settings, &qtSettings, dialog);
|
||||||
|
dialog->addPage(fontsPage, QObject::tr("Font"), QStringList() << "preferences-desktop-font" << "preferences-desktop");
|
||||||
|
QObject::connect(dialog, SIGNAL(reset()), fontsPage, SLOT(initControls()));
|
||||||
|
|
||||||
|
SelectWnd* cursorPage = new SelectWnd(settings, dialog);
|
||||||
|
cursorPage->setCurrent();
|
||||||
|
dialog->addPage(cursorPage, QObject::tr("Cursor"), QStringList() << "input-mouse" << "preferences-desktop");
|
||||||
|
|
||||||
|
dialog->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
dialog->setWindowIcon(QIcon::fromTheme("preferences-desktop-theme"));
|
||||||
|
dialog->show();
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
|||||||
|
.TH lxqt-config-appearance "1" "September 2012" "LXQt\ 0.7.0" "LXQt\ GUI settings"
|
||||||
|
.SH NAME
|
||||||
|
lxqt-config-appearance \- GUI appearance application of \fBLXQt\fR: the faster and lighter QT Desktop Environment
|
||||||
|
.SH SYNOPSIS
|
||||||
|
.B lxqt-config-appearance
|
||||||
|
.br
|
||||||
|
.SH DESCRIPTION
|
||||||
|
With this application you can setting and configuring qt/lxqt gui appearance of programs.
|
||||||
|
.P
|
||||||
|
The GUI applications in linux depends of their respective subsystem, in lxqt the overal aspect of
|
||||||
|
many apps relies on QT4 framework gui. The \fBlxqt-config-appearance\fR application its the configuration center
|
||||||
|
to provide all aspects of setting \fBLXQt\fR desktop in session settings related programs.
|
||||||
|
.P
|
||||||
|
All remaining mayor aspect for lxqt appearance relies over qt4 config application (\fBqtconfig\-qt4\fR), due
|
||||||
|
the \fBLXQt\fR DE are based on Qt framework.
|
||||||
|
.P
|
||||||
|
\fBLXQt\fR is an advanced, easy-to-use, and fast desktop environment based on Qt
|
||||||
|
technologies, ships several core desktop components, all of which are optional:
|
||||||
|
.P
|
||||||
|
* Panel
|
||||||
|
* Desktop
|
||||||
|
* Application launcher
|
||||||
|
* Settings center \fI(related to this)\fR
|
||||||
|
* Session handler
|
||||||
|
* Polkit handler
|
||||||
|
* SSH pasword manager
|
||||||
|
* Display manager handler
|
||||||
|
* Power manager
|
||||||
|
.P
|
||||||
|
These components perform similar actions to those available in other desktop
|
||||||
|
environments, and their name is self-descriptive. They are usually not launched
|
||||||
|
by hand but automatically, when choosing a \fBLXQt\-qt\fR session in the Display
|
||||||
|
Manager.
|
||||||
|
.P
|
||||||
|
.SH "REPORTING BUGS"
|
||||||
|
Report bugs to https://github.com/lxde/lxde-qt/issues
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
\fBLXQt\fR it has been tailored for users who value simplicity, speed, and
|
||||||
|
an intuitive interface, also intended for less powerful machines. See also:
|
||||||
|
.\" any module must refers to session app, for more info on start it
|
||||||
|
.P
|
||||||
|
\fBlxqt-session.1\fR LXQt module for manage LXQt complete environment.
|
||||||
|
.P
|
||||||
|
\fBlxqt-config.1\fR LXQt application for general config and settings.
|
||||||
|
.P
|
||||||
|
\fBqtconfig-qt4.1\fR Qt4 application for gui and appereance settings over all qt4 based software.
|
||||||
|
.P
|
||||||
|
.SH AUTHOR
|
||||||
|
This manual page was created by \fBPICCORO Lenz McKAY\fR \fI<mckaygerhard@gmail.com>\fR
|
||||||
|
for \fBLXQt\fR project and VENENUX GNU/Linux but can be used by others.
|
@ -0,0 +1,142 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://lxde.org/
|
||||||
|
*
|
||||||
|
* Copyright: 2014 LXQt team
|
||||||
|
* Authors:
|
||||||
|
* Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#include "styleconfig.h"
|
||||||
|
#include "ui_styleconfig.h"
|
||||||
|
#include <QTreeWidget>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QStyleFactory>
|
||||||
|
#include <QToolBar>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QMetaObject>
|
||||||
|
#include <QMetaProperty>
|
||||||
|
#include <QMetaEnum>
|
||||||
|
#include <QToolBar>
|
||||||
|
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
extern void qt_x11_apply_settings_in_all_apps();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
StyleConfig::StyleConfig(LxQt::Settings* settings, QSettings* qtSettings, QWidget* parent) :
|
||||||
|
QWidget(parent),
|
||||||
|
ui(new Ui::StyleConfig),
|
||||||
|
mSettings(settings),
|
||||||
|
mQtSettings(qtSettings)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
connect(ui->styleList, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
|
||||||
|
this, SLOT(styleSelected(QTreeWidgetItem*,int)));
|
||||||
|
|
||||||
|
Q_FOREACH(const QString& name, QStyleFactory::keys())
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name));
|
||||||
|
ui->styleList->addTopLevelItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
initControls();
|
||||||
|
|
||||||
|
connect(ui->toolButtonStyle, SIGNAL(currentIndexChanged(int)), SLOT(toolButtonStyleSelected(int)));
|
||||||
|
connect(ui->singleClickActivate, SIGNAL(toggled(bool)), SLOT(singleClickActivateToggled(bool)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StyleConfig::~StyleConfig()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StyleConfig::initControls()
|
||||||
|
{
|
||||||
|
// read Qt style settings from Qt Trolltech.conf config
|
||||||
|
mQtSettings->beginGroup(QLatin1String("Qt"));
|
||||||
|
QString currentTheme = mQtSettings->value("style").toString();
|
||||||
|
mQtSettings->endGroup();
|
||||||
|
|
||||||
|
QTreeWidgetItemIterator it(ui->styleList);
|
||||||
|
while (*it) {
|
||||||
|
if ((*it)->data(0, Qt::DisplayRole).toString() == currentTheme)
|
||||||
|
{
|
||||||
|
ui->styleList->setCurrentItem((*it));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++it;
|
||||||
|
}
|
||||||
|
|
||||||
|
// read other widget related settings form LxQt settings.
|
||||||
|
QByteArray tb_style = mSettings->value("tool_button_style").toByteArray();
|
||||||
|
// convert toolbar style name to value
|
||||||
|
QMetaEnum me = QToolBar::staticMetaObject.property(QToolBar::staticMetaObject.indexOfProperty("toolButtonStyle")).enumerator();
|
||||||
|
int val = me.keyToValue(tb_style.constData());
|
||||||
|
if(val == -1)
|
||||||
|
val = Qt::ToolButtonTextBesideIcon;
|
||||||
|
ui->toolButtonStyle->setCurrentIndex(val);
|
||||||
|
|
||||||
|
// activate item views with single click
|
||||||
|
ui->singleClickActivate->setChecked( mSettings->value("single_click_activate", false).toBool());
|
||||||
|
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void StyleConfig::styleSelected(QTreeWidgetItem* item, int column)
|
||||||
|
{
|
||||||
|
Q_UNUSED(column);
|
||||||
|
if (!item)
|
||||||
|
return;
|
||||||
|
QVariant themeName = item->data(0, Qt::DisplayRole);
|
||||||
|
mQtSettings->beginGroup(QLatin1String("Qt"));
|
||||||
|
mQtSettings->setValue("style", themeName);
|
||||||
|
mQtSettings->endGroup();
|
||||||
|
mQtSettings->sync();
|
||||||
|
|
||||||
|
#ifdef Q_WS_X11
|
||||||
|
qt_x11_apply_settings_in_all_apps();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void StyleConfig::toolButtonStyleSelected(int index)
|
||||||
|
{
|
||||||
|
// convert style value to string
|
||||||
|
QMetaEnum me = QToolBar::staticMetaObject.property(QToolBar::staticMetaObject.indexOfProperty("toolButtonStyle")).enumerator();
|
||||||
|
if(index == -1)
|
||||||
|
index = Qt::ToolButtonTextBesideIcon;
|
||||||
|
const char* str = me.valueToKey(index);
|
||||||
|
if(str)
|
||||||
|
{
|
||||||
|
mSettings->setValue("tool_button_style", str);
|
||||||
|
mSettings->sync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StyleConfig::singleClickActivateToggled(bool toggled)
|
||||||
|
{
|
||||||
|
mSettings->setValue("single_click_activate", toggled);
|
||||||
|
mSettings->sync();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
|||||||
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
||||||
|
* (c)LGPL2+
|
||||||
|
*
|
||||||
|
* LXQt - a lightweight, Qt based, desktop toolset
|
||||||
|
* http://razor-qt.org
|
||||||
|
*
|
||||||
|
* Copyright: 2012 Razor team
|
||||||
|
* Authors:
|
||||||
|
* Alexander Sokoloff <sokoloff.a@gmail.com>
|
||||||
|
*
|
||||||
|
* This program or library is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU Lesser General
|
||||||
|
* Public License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
* Boston, MA 02110-1301 USA
|
||||||
|
*
|
||||||
|
* END_COMMON_COPYRIGHT_HEADER */
|
||||||
|
|
||||||
|
#ifndef STYLECONFIG_H
|
||||||
|
#define STYLECONFIG_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <LXQt/Settings>
|
||||||
|
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
class QSettings;
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class StyleConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
class StyleConfig : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit StyleConfig(LxQt::Settings *settings, QSettings *qtSettings, QWidget *parent = 0);
|
||||||
|
~StyleConfig();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void initControls();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void styleSelected(QTreeWidgetItem* item, int column);
|
||||||
|
void toolButtonStyleSelected(int index);
|
||||||
|
void singleClickActivateToggled(bool toggled);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::StyleConfig *ui;
|
||||||
|
QSettings *mQtSettings;
|
||||||
|
LxQt::Settings *mSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // STYLECONFIG_H
|
@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>StyleConfig</class>
|
||||||
|
<widget class="QWidget" name="StyleConfig">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>490</width>
|
||||||
|
<height>363</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Widget Style</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QTreeWidget" name="styleList">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>1</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="alternatingRowColors">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<attribute name="headerVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string notr="true">1</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QLabel" name="label_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Toolbar button style:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QComboBox" name="toolButtonStyle">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Only display the icon</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Only display the text</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>The text appears beside the icon</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>The text appears under the icon</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Default</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0" colspan="2">
|
||||||
|
<widget class="QCheckBox" name="singleClickActivate">
|
||||||
|
<property name="text">
|
||||||
|
<string>Activate item on single click</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
@ -0,0 +1,225 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="en_US">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>LxQtThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../lxqtthemeconfig.ui" line="23"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[ar]=تهيئة مظهر سطح المكتب ريزر
|
||||||
|
GenericName[ar]=تهيئة مظهر ريزر
|
||||||
|
Name[ar]=تهيئة مظهر ريزر
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[cs]=Nastavit vzhled pracovní plochy LxQt
|
||||||
|
GenericName[cs]=Nastavení vzhledu
|
||||||
|
Name[cs]=Nastavení vzhledu
|
@ -0,0 +1,232 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="cs">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>Nastavení vzhledu</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<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>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>Nastavení vzhledu</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Téma ikon</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>Motiv LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[cs_CZ]=Nastavit vzhled pracovní plochy LXQt
|
||||||
|
GenericName[cs_CZ]=Nastavení vzhledu
|
||||||
|
Name[cs_CZ]=Nastavení vzhledu
|
@ -0,0 +1,232 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="cs_CZ">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>Nastavení vzhledu</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<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>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>Nastavení vzhledu</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Téma ikon</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>Motiv LXQt</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[da]=Indstilling af LXQt udseende
|
||||||
|
GenericName[da]=Indstilling af LXQt Udseende
|
||||||
|
Name[da]=Indstilling af LXQt Udseende
|
@ -0,0 +1,232 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="da">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Indstillinger for Udseende</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<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>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Indstillinger for Udseende</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Ikontema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>LXQt Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[da_DK]=Indstil udseende på LXQt skrivebord
|
||||||
|
GenericName[da_DK]=Indstilling af LXQt Udseende
|
||||||
|
Name[da_DK]=Indstilling af LXQt Udseende
|
@ -0,0 +1,232 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="da_DK">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Indstillinger for Udseende</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<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>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Indstillinger for Udseende</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Ikontema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>LXQt Tema</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[de]=Einstellungen zum Aussehen der LXQt Arbeitsfläche
|
||||||
|
GenericName[de]=LXQt Erscheinungsbild Einstellungen
|
||||||
|
Name[de]=LXQt Erscheinungsbild Einstellungen
|
@ -0,0 +1,225 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.0" language="de">
|
||||||
|
<context>
|
||||||
|
<name>FontsConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="23"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation>Schriftart</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="30"/>
|
||||||
|
<source>Default font for user interface</source>
|
||||||
|
<translation>Standardschriftart der Bedienoberfläche</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="36"/>
|
||||||
|
<source>Font name:</source>
|
||||||
|
<translation>Name:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="46"/>
|
||||||
|
<source>Style:</source>
|
||||||
|
<translation>Stil:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="53"/>
|
||||||
|
<source>Point size:</source>
|
||||||
|
<translation>Punktgröße:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="64"/>
|
||||||
|
<source>Normal</source>
|
||||||
|
<translation>Normal</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="69"/>
|
||||||
|
<source>Bold</source>
|
||||||
|
<translation>Fett</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="74"/>
|
||||||
|
<source>Italic</source>
|
||||||
|
<translation>Kursiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="79"/>
|
||||||
|
<source>Bold Italic</source>
|
||||||
|
<translation>Fett und kursiv</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="90"/>
|
||||||
|
<source>The following settings only affect newly started applications</source>
|
||||||
|
<translation>Folgende Einstellungen wirken nur auf neu gestartete Programme</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="96"/>
|
||||||
|
<source>Use antialias fonts</source>
|
||||||
|
<translation>Kantenglättung bei Schriften verwenden</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="103"/>
|
||||||
|
<source>Font hinting style:</source>
|
||||||
|
<translation>Hinting-Stil:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="114"/>
|
||||||
|
<location filename="../fontsconfig.ui" line="179"/>
|
||||||
|
<source>None</source>
|
||||||
|
<translation>Keine</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="119"/>
|
||||||
|
<source>Slight</source>
|
||||||
|
<translation>Leicht</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="124"/>
|
||||||
|
<source>Medium</source>
|
||||||
|
<translation>Mittel</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="129"/>
|
||||||
|
<source>Full</source>
|
||||||
|
<translation>Vollständig</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="137"/>
|
||||||
|
<source>Font hinting</source>
|
||||||
|
<translation>Schrift-Hinting</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="144"/>
|
||||||
|
<source>Resolution (DPI):</source>
|
||||||
|
<translation>Auflösung (DPI):</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="151"/>
|
||||||
|
<source>Autohint</source>
|
||||||
|
<translation>Autohint</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="168"/>
|
||||||
|
<source>Subpixel antialiasing:</source>
|
||||||
|
<translation>Subpixel-Anordnung:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="184"/>
|
||||||
|
<source>RGB</source>
|
||||||
|
<translation>RGB</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="189"/>
|
||||||
|
<source>BGR</source>
|
||||||
|
<translation>BGR</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="194"/>
|
||||||
|
<source>VRGB</source>
|
||||||
|
<translation>VRGB</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../fontsconfig.ui" line="199"/>
|
||||||
|
<source>VBGR</source>
|
||||||
|
<translation>VBGR</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>IconThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="14"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Erscheinungsbild-Konfiguration</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../iconthemeconfig.ui" line="26"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Symboldesign</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>LxQtThemeConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../lxqtthemeconfig.ui" line="23"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>LXQt-Design</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QObject</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="45"/>
|
||||||
|
<source>LXQt Appearance Configuration</source>
|
||||||
|
<translation>LXQt Erscheinungsbild-Konfiguration</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="51"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation>Stil der Bedienelemente</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="55"/>
|
||||||
|
<source>Icons Theme</source>
|
||||||
|
<translation>Symboldesign</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="59"/>
|
||||||
|
<source>LXQt Theme</source>
|
||||||
|
<translation>LXQt-Design</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="63"/>
|
||||||
|
<source>Font</source>
|
||||||
|
<translation>Schriftart</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../main.cpp" line="68"/>
|
||||||
|
<source>Cursor</source>
|
||||||
|
<translation>Mauszeiger</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>StyleConfig</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="23"/>
|
||||||
|
<source>Widget Style</source>
|
||||||
|
<translation>Stil der Bedienelemente</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="54"/>
|
||||||
|
<source>Toolbar button style:</source>
|
||||||
|
<translation>Werkzeugleistenstil:</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="62"/>
|
||||||
|
<source>Only display the icon</source>
|
||||||
|
<translation>Nur Symbol</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="67"/>
|
||||||
|
<source>Only display the text</source>
|
||||||
|
<translation>Nur Text</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="72"/>
|
||||||
|
<source>The text appears beside the icon</source>
|
||||||
|
<translation>Text neben dem Symbol</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="77"/>
|
||||||
|
<source>The text appears under the icon</source>
|
||||||
|
<translation>Text unterhalb des Symbols</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="82"/>
|
||||||
|
<source>Default</source>
|
||||||
|
<translation>Default</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../styleconfig.ui" line="90"/>
|
||||||
|
<source>Activate item on single click</source>
|
||||||
|
<translation>Einfacher Klick aktiviert Elemente</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[el_GR]=Διαμόρφωση εμφάνισης της επιφάνειας εργασίας LXQt
|
||||||
|
GenericName[el_GR]=Διαμόρφωση εμφάνισης LXQt
|
||||||
|
Name[el_GR]=Διαμόρφωση εμφάνισης LXQt
|
@ -0,0 +1,4 @@
|
|||||||
|
# Translations
|
||||||
|
Comment[eo]=Agordi aperon de LXQt-labortablo
|
||||||
|
GenericName[eo]=Agordoj de apero de LXQt
|
||||||
|
Name[eo]=Agordoj de apero de LXQt
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue