Compare commits

...

98 Commits

Author SHA1 Message Date
e3369fef43 Update Standards-Version to 4.7.1, no changes needed. 2025-02-21 17:01:22 -06:00
ba2b60a90f Recommend iso-flags-svg to utilize the new flags feature in the locale menu. 2025-02-15 00:38:08 -06:00
252322969a Fix manpage installation. 2025-02-08 01:28:09 -06:00
0d78585d32 New upstream release. 2025-02-07 14:34:49 -06:00
b4c43c34f4 No-change rebuild for lxqt-build-tools C++17 -> C++20. 2025-02-07 14:33:19 -06:00
937c6440c0 Upload to Plucky 2024-11-15 15:34:45 -06:00
2fc4a49f12 Make Lintian happy 2024-11-05 18:16:03 -06:00
4604a4dfa9 Bump build dependencies. 2024-11-05 17:54:32 -06:00
71970be5f8 New upstream release. 2024-11-05 17:52:14 -06:00
Rik Mills
5084b73cc5 release to oracular 2024-08-27 11:36:32 +01:00
Rik Mills
db1b09be0f Fix libkscreen build dep package name 2024-08-27 11:35:52 +01:00
Aaron Rainbolt
4969e799e6 Release to Oracular 2024-08-15 16:41:30 -05:00
Aaron Rainbolt
4a2ef81a60 PPA build 2024-06-29 23:38:38 -05:00
Aaron Rainbolt
27240de48d Adjust build deps 2024-06-26 23:34:54 -05:00
Aaron Rainbolt
4486c16c89 Drop old patches 2024-06-26 23:27:18 -05:00
Aaron Rainbolt
8278458f9a Bump Standards-Version 2024-06-26 23:27:01 -05:00
Aaron Rainbolt
26006982ad Update copyright file 2024-06-26 23:24:50 -05:00
Aaron Rainbolt
b170bc0e01 Bump version for new upstream release 2024-06-26 23:23:58 -05:00
97426de1ba Add two upstream patches to improve the user experience, especially around monitor handling. 2023-12-22 16:15:11 -06:00
2434c333db Tweak changelog wording 2023-11-12 18:32:19 -06:00
a312176ac2 Create upstream/metadata file 2023-11-12 18:31:56 -06:00
edf255ebbf Remove obsolete linker flag 2023-11-12 18:30:29 -06:00
b3a71dfc80 Update lintian-overrides syntax 2023-11-12 18:29:48 -06:00
f4b4fe360f Fix lxqt-config.install 2023-11-12 18:29:33 -06:00
e9e1a134e3 Add lxqt-build-tools dep 2023-11-12 18:17:04 -06:00
252f96308a Bump build dep versions 2023-11-12 18:16:55 -06:00
2433e53536 Bump version for new upstream release 2023-11-12 18:12:59 -06:00
adcfbd486a Upload to Mantic. 2023-08-11 09:50:05 -05:00
a0a7a4b7c1 Fix the copyright years. 2023-08-11 09:36:02 -05:00
a81ba8b39a Bump Standards-version to 4.6.2, no changes needed. 2023-08-11 09:35:06 -05:00
ba24636c89 I guess we don't require root to build, do we? 2023-08-11 09:34:05 -05:00
d52449ad89 Bad trailing whitespace. 2023-08-11 09:32:58 -05:00
6ec9faea73 Bump build dependencies. 2023-08-10 16:42:35 -05:00
174f42d141 New upstream release. 2023-08-10 16:38:40 -05:00
da8184d511 Upload to Lunar. 2022-11-18 17:10:55 -06:00
f5a0640c17 Drop reverse-applicable patch. 2022-11-18 15:04:55 -06:00
70c8b521bd Bump build dependencies in debian/control. 2022-11-18 15:04:23 -06:00
e0dc8d84fc Bump Standards-version, no changes needed. 2022-11-18 15:02:58 -06:00
38563c20e0 Lubuntuify the package slightly, to make debhelper happy. 2022-11-18 15:01:42 -06:00
d9da7ba361 Fix the watch file, for real this time. 2022-11-18 14:45:10 -06:00
8cec5002f0 New upstream version. 2022-11-18 14:44:07 -06:00
fdeb611940 Revert "Sync with Debian version 1.1.0-1."
This reverts commit aa5018171adfd6a1d4adacbecca0bd5cab9f6b43.
2022-11-18 14:43:20 -06:00
aa5018171a Sync with Debian version 1.1.0-1. 2022-11-18 14:41:49 -06:00
b9f50f4508 Sync with Ubuntu version 1.1.0-0ubuntu2. 2022-11-18 14:40:56 -06:00
6f89289577 Sync with Ubuntu version 1.1.0-0ubuntu1. 2022-11-18 14:40:40 -06:00
apt-ghetto
a3d83aa002 New upstream release lxqt-config
Summary:
Packaged new upstream release 0.17.1 of lxqt-config
Updated changelog, control, copyright
Updated lintian-overrides, lxqt-config.install, manpages

Test Plan: Built successfully on https://launchpad.net/~apt-ghetto/+archive/ubuntu/ludev

Reviewers: kc2bez

Reviewed By: kc2bez

Differential Revision: https://phab.lubuntu.me/D123
2021-08-15 19:04:59 -04:00
Raman Sarda
e522e9d204 New upstream version. 2021-02-22 00:24:24 +05:30
ce2e26bf88 Upload to Groovy. 2020-06-04 00:42:40 -05:00
136c14cfbf Bump LXQt build dependencies. 2020-04-28 18:32:34 -05:00
1d0b25fb9f Update upstream signing key. 2020-04-28 18:27:42 -05:00
6888335e13 debhelper -> debhelper-compat. 2020-04-28 18:26:40 -05:00
b856aa8ac2 Bump Standards-version to 4.5.0, no changes needed. 2020-04-28 18:26:08 -05:00
3faf1e4180 New upstream release. 2020-04-28 18:25:45 -05:00
9bc13f2c07 Add build dependency on libxcb-randr0-dev (Closes: #952266). 2020-04-24 00:24:19 -05:00
Simon Quigley
00abd429dd Upload to Disco. 2019-03-09 12:55:06 -06:00
Simon Quigley
53042f8a0e Run wrap-and-sort. 2019-03-09 12:54:53 -06:00
Simon Quigley
2019965763 New upstream release. 2019-03-09 12:54:43 -06:00
Simon Quigley
687bcb25eb Upload to Disco. 2019-01-26 00:07:25 -06:00
Simon Quigley
2e5c61f0fd Remove unneeded patches. 2019-01-26 00:07:07 -06:00
Simon Quigley
f940770c41 Add new lxqt-config-l10n package. 2019-01-26 00:04:30 -06:00
Simon Quigley
b135ae2d50 Bump build dependencies. 2019-01-26 00:02:21 -06:00
Simon Quigley
8c52dd6981 Bump debhelper compat to 12, no changes needed. 2019-01-26 00:01:54 -06:00
Simon Quigley
fe5220e2ec New upstream release. 2019-01-26 00:01:22 -06:00
Simon Quigley
bf55320b25 Upload to Disco. 2019-01-05 15:08:09 -06:00
Simon Quigley
54b73cb4c8 Don't recommend lxqt-config-l10n and conflict it at the same time. 2019-01-05 15:07:59 -06:00
Simon Quigley
486282e1fe Add Conflicts/Replaces for lxqt-config-l10n. 2018-12-30 17:42:50 -06:00
Simon Quigley
e223755613 Upload to Disco. 2018-12-30 17:21:44 -06:00
Simon Quigley
ae3e0d2148 Bump Standards-version to 4.3.0, no changes needed. 2018-12-30 17:21:26 -06:00
Simon Quigley
1b2be5bf1a Add missing build dependencies. 2018-12-30 17:20:57 -06:00
Simon Quigley
a981c13191 Add a patch lowering the LXQt version required. 2018-12-30 17:13:25 -06:00
Simon Quigley
de71e1d6d9 Remove reverse-applicable patches. 2018-12-30 17:06:40 -06:00
Simon Quigley
00959e0068 New upstream Git snapshot. 2018-12-30 16:39:48 -06:00
Simon Quigley
d7477bbb32 Bad whitespace is bad. 2018-10-06 16:34:44 -05:00
Hans P Möller
3acc96e087 Set default GTK theme if rc file doesn't exists.
Summary: Set default GTK theme if rc file doesn't exists.

Test Plan: See if default GTK theme is according to 'gsettings get org.gnome.desktop.interface gtk-theme'

Reviewers: wxl, tsimonq2

Reviewed By: wxl, tsimonq2

Differential Revision: https://phab.lubuntu.me/D27
2018-10-06 08:58:57 -07:00
Simon Quigley
a4916b21f5 Fix the timezone in the changelog. 2018-09-04 17:09:18 -05:00
1d42b9727e Make a path for GTK settings if it does not exist.
Summary: Can't change GTK3 theme in lxqt-config-appearance if settings don't exist, so create it.

Test Plan:
 1. Open lxqt-config-appearance
 1. Check "Set GTK themes"
 1. Change "GTK 3 Theme" to Arc
 1. Close lxqt-config-appearance
 1. Open lxqt-config-appearance

"GTK 3 Theme" should be set to Arc and not the default, Adwaita.

Reviewers: tsimonq2

Reviewed By: tsimonq2

Differential Revision: https://phab.lubuntu.me/D13
2018-09-03 23:53:32 -07:00
Simon Quigley
a34837de82 Upload to Cosmic. 2018-08-09 14:24:52 -05:00
Simon Quigley
540ecebb19 Demote qt5-style-plugins to a Suggests, because some of the themes are not working (LP: #1785401). 2018-08-09 14:15:44 -05:00
Simon Quigley
3c7d00623d Run wrap-and-sort. 2018-08-09 14:13:43 -05:00
Simon Quigley
2ce06b996b Upload to Cosmic. 2018-07-30 16:35:17 -05:00
Simon Quigley
ae2282e219 Add support for modifying GTK themes. 2018-07-30 16:33:51 -05:00
Simon Quigley
14204f0dcd Change Uploaders to Ubuntu uploaders. 2018-07-30 16:22:45 -05:00
Simon Quigley
4b875c24b3 Bump Standards-version to 4.1.5, no changes needed. 2018-07-30 16:22:14 -05:00
Simon Quigley
9102668b40 Release to Cosmic. 2018-05-22 23:25:48 -05:00
Simon Quigley
be873c789d Update build dependencies. 2018-05-22 22:07:52 -05:00
Simon Quigley
0053dc4752 Update Vcs-* and Maintainer to Lubuntu values. 2018-05-22 21:49:39 -05:00
Simon Quigley
34deeaf154 Remove pristine-tar files. 2018-05-22 21:45:38 -05:00
Simon Quigley
372eae0604 New upstream release. 2018-05-22 21:42:44 -05:00
Alf Gaida
1c7fb95890 Some updated in debian $foo
* Bumped compat to 11
* Bumped debhelper to >=11~
* Bumped Standards to 4.1.4, no changes needed
* Changed VCS fields to salsa
* Changed Homepage, Source and watch to lxqt
* Bumped years in copyright
2018-04-28 00:22:58 +02:00
Alf Gaida
3c85ed6e87 Cleanup debian/*
* Bumped Standards to 4.1.2, no changes needed
* Removed debian/gbp.conf
* Removed branch from VCS fields
2017-12-14 18:49:40 +01:00
Alf Gaida
b41ab76891 Transition to unstable
* Removed debian/patches
2017-12-04 21:34:07 +01:00
Alf Gaida
7611e3375f Cherry-picking upstream version 0.12.0. 2017-12-04 21:28:20 +01:00
Alf Gaida
65b8a7e03f Ported back some upstream changes. (Closes: #871154)
Make lxqt-config work with cmake > 3.7.2
2017-08-12 16:06:40 +02:00
Alf Gaida
45e0efb389 Fix new moc behaviour of cmake 3.9.x 2017-08-12 15:03:46 +02:00
Alf Gaida
8bd1a6f4a3 Some minor fixes
* Fixed typo lxapperance --> lxappearance
* Fixed some arches to [linux-any]
2017-07-05 02:38:52 +02:00
Alf Gaida
2d17af99db Overhaul some debian/$foo
* Bump Standards to 4.0.0 - no changes needed
* Recommend lxqt-qtplugin (Closes: #866234)
* Recommend lxqt-policykit (Closes: #866739)
* Recommend lxqt-session and lxqt-powermanagement (Closes: #866760)
* Recommend galternatives and systemconfig-printer, suggest
  diskmanager, gparted, networkmanagement, synaptic (Closes: #866763)
* Recommend qt5-style-plugins and suggest adwaita-qt (Closes: #866774)
* Suggest gnome-themes-standard and faenza-icon-theme (Closes: #866775)
2017-07-01 18:24:22 +02:00
Alf Gaida
f6a88cd690 Chery-picking new upstream release 0.11.1.
* Removed some build dependencies:
  -cmake
  -libqt5xdg-dev
  -libqt5xdgiconloader-dev
  -pkg-config
  -qttools5-dev
  -qttools5-dev-tools
* Bumped build dependency liblxqt0-dev (>= 0.11.1)
* Bumped years in d/copyright
* Added Recommends galternatives
2017-01-02 12:37:01 +01:00
Alf Gaida
f2573945ac Chery-picking new upstream release 0.11.0
* Synced debian foo with experimental
* Bumped Standards to 3.9.8, no changes needed
* Bumped compat to 10
* Removed --parallel from rules, compat 10 standard
* Bumped build dependency debhelper (>= 10)
* Bumped build dependency libqtxdg-dev (>= 2.0.0)
* Added build-depenedency libqt5xdgiconloader-dev (>= 2.0.0)
* Bumped build dependency liblxqt-dev (>= 0.11.0)
* Added build dependency libqt5svg5-dev
* Added Recommends lxqt-config-l10n
* Added README.md to docs
* Exported LC_ALL=C.UTF-8 - define language settings for reproducible
  builds
* Fixed .gititgnore, added build-stamp
* Fixed VCS fields, use https and plain /git/
* Fixed copyright Format
* Added missed new files to copyright
* Bumped years in copyright
* Fixed lintian-overrides
* Added DEB_BUILD_MAINT_OPTIONS = hardening=+all
* Added translation control
* Added DCMAKE_BUILD_TYPE=RelWithDebInfo
2016-10-18 02:28:13 +02:00
410 changed files with 608 additions and 46144 deletions

1
.gitignore vendored
View File

@ -1 +0,0 @@
build

13
AUTHORS
View File

@ -1,13 +0,0 @@
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 'LICENSE' file.
The lxqt-config-cursor component is based on the "qt-xcurtheme" project
and is licensed under GPL 2, GPL 3, LGPL-2, LGPL-2.1 and WTFPL 2.

View File

@ -1,43 +0,0 @@
cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
project(lxqt-config)
set(LXQT_CONFIG_PROJECT "${PROJECT_NAME}")
option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
include(GNUInstallDirs)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC 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)
include(LXQtCompilerSettings NO_POLICY_SCOPE)
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)
add_subdirectory(lxqt-config-locale)
# 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)

458
LICENSE
View File

@ -1,458 +0,0 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[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

1
debian/.gitignore vendored
View File

@ -3,6 +3,7 @@
/*.debhelper
/*.log
/*.substvars
/debhelper-build-stamp
/files
/lxqt-config/

385
debian/changelog vendored
View File

@ -1,3 +1,386 @@
lxqt-config (2.1.1-0ubuntu4) plucky; urgency=medium
* Update Standards-Version to 4.7.1, no changes needed.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 21 Feb 2025 16:48:27 -0600
lxqt-config (2.1.1-0ubuntu3) plucky; urgency=medium
* Recommend iso-flags-svg to utilize the new flags feature in the locale
menu.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 15 Feb 2025 00:37:37 -0600
lxqt-config (2.1.1-0ubuntu2) plucky; urgency=medium
* Fix manpage installation.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 08 Feb 2025 01:28:05 -0600
lxqt-config (2.1.1-0ubuntu1) plucky; urgency=medium
* New upstream release.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 07 Feb 2025 14:34:41 -0600
lxqt-config (2.1.0-0ubuntu1) plucky; urgency=medium
* New upstream release.
- Bump build dependencies.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 15 Nov 2024 15:32:32 -0600
lxqt-config (2.0.0-0ubuntu2) oracular; urgency=medium
* Fix libkscreen build dep package name.
-- Rik Mills <rikmills@kde.org> Tue, 27 Aug 2024 11:33:02 +0100
lxqt-config (2.0.0-0ubuntu1) oracular; urgency=medium
* New upstream release.
* Update copyright file.
* Bump Standards-Version to 4.7.0, no changes necessary.
* Remove obsolete patches.
* Adjust build dependencies.
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Thu, 15 Aug 2024 16:41:23 -0500
lxqt-config (1.4.0-0ubuntu2) noble; urgency=medium
* Add two upstream patches to improve the user experience, especially around
monitor handling.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 22 Dec 2023 16:05:33 -0600
lxqt-config (1.4.0-0ubuntu1) noble; urgency=medium
* New upstream release.
* Bumped build dependency versions.
* Added lxqt-menu-data as a build dependency.
* Removee no-longer-existing files from lxqt-config.install.
* Updated lintian-overrides syntax.
* Removed obsolete '-Wl,--as-needed' linker flag.
* Created upstream/metadata file.
-- Aaron Rainbolt <arraybolt3@gmail.com> Sun, 12 Nov 2023 18:12:05 -0600
lxqt-config (1.3.0-0ubuntu1) mantic; urgency=medium
* New upstream release.
* Bump build dependencies.
* I guess we don't require root to build, do we?
* Bump Standards-version to 4.6.2, no changes needed.
* Fix the copyright years.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 11 Aug 2023 09:49:54 -0500
lxqt-config (1.2.0-0ubuntu1) lunar; urgency=medium
* New upstream version.
* Fix the watch file, for real this time.
* Lubuntuify the package slightly, to make debhelper happy.
* Bump Standards-version, no changes needed.
* Bump build dependencies in debian/control.
* Drop reverse-applicable patch.
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 18 Nov 2022 17:09:36 -0600
lxqt-config (1.1.0-0ubuntu2) kinetic; urgency=medium
* Enhancements to the theme list.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 11 Jun 2022 14:22:35 -0400
lxqt-config (1.1.0-0ubuntu1) kinetic; urgency=medium
* New upstream release.
* Bump build dependencies.
* Remove old Breaks/Replaces since we're past the LTS.
* Add a new entry to the install file.
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 01 Jun 2022 15:00:38 -0500
lxqt-config (0.17.1-0ubuntu1) impish; urgency=medium
* New upstream release 0.17.1
* Update debian/control
- Bump Standards-Version to 4.5.1
- Use liblxqt0-dev 0.17.0
* Rename tag for lintian override
* Update debian/copyright
* Run wrap-and-sort
-- apt-ghetto <apt-ghetto@protonmail.com> Thu, 12 Aug 2021 17:03:12 +0200
lxqt-config (0.16.1-1ubuntu1) hirsute; urgency=medium
* New upstream version.
* Updated recommends.
* Bumped debhelper-compat requirement to 13.
* Fixed manpage errors about files existing in debian/tmp but not installed anywhere.
-- Raman Sarda <theloudspeaker@disroot.org> Sun, 21 Feb 2021 22:44:21 +0530
lxqt-config (0.16.1-1) unstable; urgency=medium
* New upstream release. (Closes: #864482)
* debian/control: updated build-deps.
* debian/control: drop disk-manager from recommends as it has been
removed from unstable. (Closes: #952967)
* Update debian/lxqt-config.install to ship new binary files.
-- Andrew Lee (李健秋) <ajqlee@debian.org> Wed, 06 Jan 2021 16:09:45 +0800
lxqt-config (0.15.0-0ubuntu1) groovy; urgency=medium
* New upstream release.
- Update upstream signing key.
- Bump LXQt build dependencies.
- Add build dependency on libxcb-randr0-dev (Closes: #952266).
* Bump Standards-version to 4.5.0, no changes needed.
* debhelper -> debhelper-compat.
-- Simon Quigley <tsimonq2@ubuntu.com> Thu, 04 Jun 2020 00:42:32 -0500
lxqt-config (0.14.1-4) unstable; urgency=medium
* Added build dependency libxcb-randr0-dev to fix FTBFS in testing and sid.
Thanks Lucas Nussbaum <lucas@debian.org> for spotting this.
(Closes: #952266)
* Bumped Standards-Version to 4.5.0, no changes needed
* Switched to gbp
-- Alf Gaida <agaida@siduction.org> Mon, 24 Feb 2020 01:49:32 +0100
lxqt-config (0.14.1-3) unstable; urgency=medium
* Build without touchpad support on kfreebsd and hurd, thanks
Paul Sonnenschein <paul@sonnenschein.ruhr> (Closes: #933336)
-- Alf Gaida <agaida@siduction.org> Sun, 04 Aug 2019 04:07:48 +0200
lxqt-config (0.14.1-2) unstable; urgency=medium
* Fixed keyboard layout switch shortcut (Closes: #925346)
-- Alf Gaida <agaida@siduction.org> Sat, 23 Mar 2019 15:53:38 +0100
lxqt-config (0.14.1-1) unstable; urgency=medium
* Cherry-picking new upstream version 0.14.1.
* Bumped build dependency liblxqt to 0.14.1~
* Extended the package description a bit
-- Alf Gaida <agaida@siduction.org> Sun, 24 Feb 2019 20:35:48 +0100
lxqt-config (0.14.1-0ubuntu1) disco; urgency=medium
* New upstream release.
* Run wrap-and-sort.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 09 Mar 2019 12:54:59 -0600
lxqt-config (0.14.0-1) unstable; urgency=medium
* Cherry-picking new upstream version 0.14.0.
* Bumped Standards to 4.3.0, no changes needed
* Dropped d/compat, use debhelper-compat = 12, no changes needed
* Fixed years in d/copyright
* Bumped minimum version liblxqt0-dev (>= 0.14.0~)
* Added build dependency libxi-dev
* Added build dependency xserver-xorg-input-libinput-dev
* Removed obsolete PULL_TRANSLATIONS= OFF from dh_auto_configure
* Added l10n-package, moved from lxqt-l10n
* Added d/upstream/metadata
* Fixed d/manpages
* Basic Touchpad configuration added upstream (Closes: #845624)
-- Alf Gaida <agaida@siduction.org> Sun, 27 Jan 2019 17:15:29 +0100
lxqt-config (0.14.0-0ubuntu1) disco; urgency=medium
* New upstream release.
- Bump build dependencies.
- Remove unneeded patches.
* Bump debhelper compat to 12, no changes needed.
* Add new lxqt-config-l10n package.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 26 Jan 2019 00:07:14 -0600
lxqt-config (0.13.0+git20181226-0ubuntu3) disco; urgency=medium
* Don't recommend lxqt-config-l10n and conflict it at the same time.
-- Simon Quigley <tsimonq2@ubuntu.com> Sat, 05 Jan 2019 15:08:01 -0600
lxqt-config (0.13.0+git20181226-0ubuntu2) disco; urgency=medium
* Add Conflicts/Replaces for lxqt-config-l10n.
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 30 Dec 2018 17:42:43 -0600
lxqt-config (0.13.0+git20181226-0ubuntu1) disco; urgency=medium
* New upstream Git snapshot.
- Remove reverse-applicable patches.
- Add a patch lowering the LXQt version required.
- Add missing build dependencies.
* Bump Standards-version to 4.3.0, no changes needed.
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 30 Dec 2018 17:21:31 -0600
lxqt-config (0.13.0-1) unstable; urgency=medium
* Cherry-picking new upstream version 0.13.0.
* Bumped build dependency liblxqt0-dev to >= 0.13.0~
* Added recommend xsettingsd
-- Alf Gaida <agaida@siduction.org> Thu, 24 May 2018 20:43:08 +0200
lxqt-config (0.13.0-0ubuntu5) cosmic; urgency=medium
* Set default GTK theme if rc file doesn't exists.
-- Hans P. Möller <hmoller@gmail.com> Thu, 04 Oct 2018 14:44:03 -0300
lxqt-config (0.13.0-0ubuntu4) cosmic; urgency=medium
* Make a path for GTK settings if it does not exist.
-- Walter Lapchynski <wxl@ubuntu.com> Mon, 03 Sep 2018 00:43:25 -7000
lxqt-config (0.13.0-0ubuntu3) cosmic; urgency=medium
* Run wrap-and-sort.
* Demote qt5-style-plugins to a Suggests, because some of the themes are not
working (LP: #1785401).
-- Simon Quigley <tsimonq2@ubuntu.com> Thu, 09 Aug 2018 14:24:44 -0500
lxqt-config (0.13.0-0ubuntu2) cosmic; urgency=medium
* Bump Standards-version to 4.1.5, no changes needed.
* Change Uploaders to Ubuntu uploaders.
* Add support for modifying GTK themes.
-- Simon Quigley <tsimonq2@ubuntu.com> Mon, 30 Jul 2018 16:35:02 -0500
lxqt-config (0.13.0-0ubuntu1) cosmic; urgency=medium
* New upstream release.
* Update Vcs-* and Maintainer to Lubuntu values.
* Update build dependencies.
-- Simon Quigley <tsimonq2@ubuntu.com> Tue, 22 May 2018 23:25:36 -0500
lxqt-config (0.12.0-4) unstable; urgency=medium
* Bumped compat to 11
* Bumped debhelper to >=11~
* Bumped Standards to 4.1.4, no changes needed
* Changed VCS fields to salsa
* Changed Homepage, Source and watch to lxqt
* Bumped years in copyright
-- Alf Gaida <agaida@siduction.org> Sat, 28 Apr 2018 00:22:41 +0200
lxqt-config (0.12.0-3) unstable; urgency=medium
* Bumped Standards to 4.1.2, no changes needed
* Removed debian/gbp.conf
* Removed branch from VCS fields
-- Alf Gaida <agaida@siduction.org> Thu, 14 Dec 2017 18:49:33 +0100
lxqt-config (0.12.0-2) unstable; urgency=medium
* Transition to unstable
* Drop no longer needed patches
-- Alf Gaida <agaida@siduction.org> Mon, 04 Dec 2017 21:33:59 +0100
lxqt-config (0.12.0-1) experimental; urgency=medium
* Cherry-picking upstream release: 0.12.0.
* Switched to experimental
* Bumped Standards to 4.1.1
* Bumped liblxqt to >= 0.12.0
* Removed debian/patches - back to pure upstream
-- Alf Gaida <agaida@siduction.org> Tue, 24 Oct 2017 16:56:57 +0200
lxqt-config (0.11.1-4) unstable; urgency=medium
* Ported back some upstream changes. (Closes: #871154)
Make lxqt-config work with cmake > 3.7.2
-- Alf Gaida <agaida@siduction.org> Sat, 12 Aug 2017 16:06:24 +0200
lxqt-config (0.11.1-3) unstable; urgency=medium
* Fixed typo lxapperance --> lxappearance
* Fixed some arches to [linux-any]
-- Alf Gaida <agaida@siduction.org> Wed, 05 Jul 2017 02:38:44 +0200
lxqt-config (0.11.1-2) unstable; urgency=medium
* Bump Standards to 4.0.0 - no changes needed
* Recommend lxqt-qtplugin (Closes: #866234)
* Recommend lxqt-policykit (Closes: #866739)
* Recommend lxqt-session and lxqt-powermanagement (Closes: #866760)
* Recommend galternatives and systemconfig-printer, suggest
diskmanager, gparted, networkmanagement, synaptic (Closes: #866763)
* Recommend qt5-style-plugins and suggest adwaita-qt (Closes: #866774)
* Suggest gnome-themes-standard and faenza-icon-theme (Closes: #866775)
-- Alf Gaida <agaida@siduction.org> Sat, 01 Jul 2017 18:24:12 +0200
lxqt-config (0.11.1-1) unstable; urgency=medium
* Chery-picking new upstream release 0.11.1.
* Removed some build dependencies:
-cmake
-libqt5xdg-dev
-libqt5xdgiconloader-dev
-pkg-config
-qttools5-dev
-qttools5-dev-tools
* Bumped build dependency liblxqt0-dev (>= 0.11.1)
* Bumped years in d/copyright
* Added Recommends galternatives
-- Alf Gaida <agaida@siduction.org> Mon, 02 Jan 2017 12:36:49 +0100
lxqt-config (0.11.0-2) unstable; urgency=medium
* Chery-picking new upstream release 0.11.0
* Synced debian foo with experimental
* Bumped Standards to 3.9.8, no changes needed
* Bumped compat to 10
* Removed --parallel from rules, compat 10 standard
* Bumped build dependency debhelper (>= 10)
* Bumped build dependency libqtxdg-dev (>= 2.0.0)
* Added build-depenedency libqt5xdgiconloader-dev (>= 2.0.0)
* Bumped build dependency liblxqt-dev (>= 0.11.0)
* Added build dependency libqt5svg5-dev
* Added Recommends lxqt-config-l10n
* Added README.md to docs
* Exported LC_ALL=C.UTF-8 - define language settings for reproducible
builds
* Fixed .gititgnore, added build-stamp
* Fixed VCS fields, use https and plain /git/
* Fixed copyright Format
* Added missed new files to copyright
* Bumped years in copyright
* Fixed lintian-overrides
* Added DEB_BUILD_MAINT_OPTIONS = hardening=+all
* Added translation control
* Added DCMAKE_BUILD_TYPE=RelWithDebInfo
-- Alf Gaida <agaida@siduction.org> Tue, 18 Oct 2016 02:28:02 +0200
lxqt-config (0.10.0-3) unstable; urgency=medium
* Remove dbg package in favor of dbgsym.
@ -18,7 +401,7 @@ lxqt-config (0.10.0-2) unstable; urgency=medium
lxqt-config (0.9.0+20150806-2) unstable; urgency=medium
* Fixed .gitignore, removed outdated entries
* Fixed debian/control sorting and removed outdated versions.
* Fixed debian/control sorting and removed outdated versions.
-- Alf Gaida <agaida@siduction.org> Wed, 11 Nov 2015 20:51:11 +0100

1
debian/compat vendored
View File

@ -1 +0,0 @@
9

71
debian/control vendored
View File

@ -1,37 +1,62 @@
Source: lxqt-config
Maintainer: LXQt Packaging Team <pkg-lxqt-devel@lists.alioth.debian.org>
Uploaders: Alf Gaida <agaida@siduction.org>,
ChangZhuo Chen (陳昌倬) <czchen@debian.org>,
Andrew Lee (李健秋) <ajqlee@debian.org>,
Yukiharu YABUKI <yyabuki@debian.org>
Maintainer: Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
Original-Maintainer: LXQt Packaging Team <pkg-lxqt-devel@lists.alioth.debian.org>
Uploaders: Simon Quigley <tsimonq2@ubuntu.com>
Section: x11
Priority: optional
Build-Depends: debhelper (>= 9),
cmake (>= 3.0.2),
libkf5screen-dev,
libkf5windowsystem-dev,
liblxqt0-dev (>= 0.10.0),
libqt5svg5-dev,
libqt5x11extras5-dev,
libqt5xdg-dev,
Build-Depends: debhelper-compat (= 13),
libkf6windowsystem-dev (>= 6.0.0),
libkscreen-dev (>= 6.0.0),
liblxqt2-dev (>= 2.1.0),
libx11-dev,
libxcb-randr0-dev,
libxcursor-dev,
libxfixes-dev,
pkg-config,
qtbase5-private-dev,
qttools5-dev,
qttools5-dev-tools,
libxi-dev,
lxqt-menu-data (>= 2.1.0),
qt6-base-private-dev (>= 6.6.0),
qt6-svg-dev (>= 6.6.0),
xserver-xorg-input-libinput-dev,
zlib1g-dev
Standards-Version: 3.9.6
Vcs-Browser: http://anonscm.debian.org/cgit/pkg-lxqt/lxqt-config.git/?h=debian/sid
Vcs-Git: git://anonscm.debian.org/pkg-lxqt/lxqt-config.git -b debian/sid
Homepage: https://github.com/lxde/lxqt-config
Standards-Version: 4.7.1
Vcs-Browser: https://git.lubuntu.me/Lubuntu/lxqt-config-packaging
Vcs-Git: https://git.lubuntu.me/Lubuntu/lxqt-config-packaging.git
Debian-Vcs-Browser: https://salsa.debian.org/lxqt-team/lxqt-config
Debian-Vcs-Git: https://salsa.debian.org/lxqt-team/lxqt-config.git
Rules-Requires-Root: no
Homepage: https://github.com/lxqt/lxqt-config
Package: lxqt-config
Architecture: any
Depends: ${misc:Depends},
${shlibs:Depends}
Depends: ${misc:Depends}, ${shlibs:Depends}
Recommends: galternatives,
iso-flags-svg,
lxqt-config-l10n,
lxqt-policykit,
lxqt-powermanagement,
lxqt-qtplugin,
lxqt-session,
system-config-printer
Suggests: adwaita-qt,
cmst [linux-any] | network-manager-gnome [linux-any],
faenza-icon-theme,
gnome-themes-standard,
gparted | partitionmanager [linux-any],
lxappearance,
lxqt | lxqt-core,
obconf-qt,
synaptic
Description: LXQt system settings center
The LXQt system settings center
.
This package contain the LXQt configuration ui.
Package: lxqt-config-l10n
Architecture: all
Multi-Arch: foreign
Section: localization
Depends: qt6-translations-l10n, ${misc:Depends}
Description: Language package for lxqt-config
The LXQt system settings center
.
This package contains the l10n files needed by lxqt-config.

69
debian/copyright vendored
View File

@ -1,12 +1,13 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: lxqt-config
Source: https://github.com/lxde/lxqt-config
Source: https://github.com/lxqt/lxqt-config
Files: *
Copyright: 2012-2015 LXQt team
2010-2012 Razor team
2013 Christian Surlykke
2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
Copyright: 2012-2024, LXQt team
2010-2012, Razor team
2013, Christian Surlykke
2014, Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
2014, Luís Pereira <luis.artur.pereira@gmail.com>
License: LGPL-2.1+
Files: lxqt-config-appearance/iconthemeinfo.cpp
@ -19,7 +20,8 @@ Copyright: 2007, 2009 Rafael Fernández López <ereslibre@kde.org>
2007 John Tapsell <tapsell@kde.org>
License: LGPL-2.0+
Files: liblxqt-config-cursor/cfgfile.h
Files: liblxqt-config-cursor/cfgfile.cpp
liblxqt-config-cursor/cfgfile.h
liblxqt-config-cursor/main.cpp
liblxqt-config-cursor/main.h
liblxqt-config-cursor/selectwnd.cpp
@ -59,7 +61,31 @@ Files: lxqt-config-input/keyboardconfig.cpp
Copyright: 2013-2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
License: GPL-2.0+
Files: lxqt-config-monitor/main.cpp
Files: lxqt-config-input/touchpadconfig.cpp
lxqt-config-input/touchpadconfig.h
lxqt-config-input/touchpaddevice.cpp
lxqt-config-input/touchpaddevice.h
Copyright: 2016-2018, Chih-Hsuan Yen <yan12125@gmail.com>
License: GPL-2.0+
Files: lxqt-config-locale/combobox.h
Copyright: 2018, Pedram Pourang <tsujan2000@gmail.com>
License: GPL-2.0+
Files: lxqt-config-locale/localeconfig.cpp
lxqt-config-locale/localeconfig.h
Copyright: 2014, LXQt team
2014, Sebastian Kügler <sebas@kde.org>
License: GPL-2.0+
Files: lxqt-config-monitor/fastmenu.cpp
lxqt-config-monitor/fastmenu.h
lxqt-config-monitor/kscreenutils.h
lxqt-config-monitor/loadsettings.cpp
lxqt-config-monitor/loadsettings.h
lxqt-config-monitor/main.cpp
lxqt-config-monitor/managesavedsettings.cpp
lxqt-config-monitor/managesavedsettings.h
lxqt-config-monitor/monitor.cpp
lxqt-config-monitor/monitor.h
lxqt-config-monitor/monitorwidget.cpp
@ -68,13 +94,36 @@ Files: lxqt-config-monitor/main.cpp
lxqt-config-monitor/monitorsettingsdialog.cpp
lxqt-config-monitor/monitorsettingsdialog.h
lxqt-config-monitor/savesettings.cpp
Copyright: 2014 P.L. Lucas <selairi@gmail.com>
lxqt-config-monitor/settingsdialog.cpp
lxqt-config-monitor/settingsdialog.h
lxqt-config-monitor/timeoutdialog.cpp
lxqt-config-monitor/timeoutdialog.h
Copyright: 2014-2016, 2019, P.L. Lucas <selairi@gmail.com>
2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
License: GPL-2.0+
Files: lxqt-config-brightness/brightnesssettings.*
lxqt-config-brightness/main.cpp
lxqt-config-brightness/monitorinfo.*
lxqt-config-brightness/outputwidget.cpp
lxqt-config-brightness/outputwidget.h
Copyright: 2016 P.L. Lucas <selairi@gmail.com>
License: LGPL-2.1+
Files: lxqt-config-brightness/brightnesswatcher.cpp
lxqt-config-brightness/brightnesswatcher.h
Copyright: 2020, Luís Pereira <luis.artur.pereira@gmail.com>
License: GPL-2.0+
Files: lxqt-config-brightness/xrandrbrightness.*
Copyright: 2015 Kai Uwe Broulik <kde@privat.broulik.de>
2010 Lukas Tinkl <ltinkl@redhat.com>
License: LGPL-2.0+
Files: debian/*
Copyright: 2014-2015 Alf Gaida <agaida@siduction.org>
Copyright: 2014-2018 Alf Gaida <agaida@siduction.org>
2015 Andrew Lee (李健秋) <ajqlee@debian.org>
2023-2025 Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
License: LGPL-2.1+
License: LGPL-2.0+

1
debian/docs vendored
View File

@ -1 +1,2 @@
AUTHORS
README.md

8
debian/gbp.conf vendored
View File

@ -1,8 +0,0 @@
[DEFAULT]
debian-branch = debian/sid
upstream-branch = upstream/latest
pristine-tar = True
[import-orig]
# Use git cherrypick -n upstream instead.
merge = False

View File

@ -1,14 +1,15 @@
# there will be no man-pages in a foreseeable future
lxqt-config: binary-without-manpage usr/bin/lxqt-config-appearance
lxqt-config: binary-without-manpage usr/bin/lxqt-config-file-associations
lxqt-config: binary-without-manpage usr/bin/lxqt-config-input
lxqt-config: binary-without-manpage usr/bin/lxqt-config-locale
lxqt-config: binary-without-manpage usr/bin/lxqt-config-monitor
lxqt-config: no-manual-page [usr/bin/lxqt-config-brightness]
lxqt-config: no-manual-page [usr/bin/lxqt-config-file-associations]
lxqt-config: no-manual-page [usr/bin/lxqt-config-input]
lxqt-config: no-manual-page [usr/bin/lxqt-config-locale]
lxqt-config: no-manual-page [usr/bin/lxqt-config-monitor]
# not a bug, LXQt has not reached free-desktop yet
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config-appearance.desktop
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config-file-associations.desktop
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config-input.desktop
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config-locale.desktop
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config-monitor.desktop
lxqt-config: desktop-entry-invalid-category LXQt usr/share/applications/lxqt-config.desktop
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-appearance.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-brightness.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-file-associations.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-input.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-locale.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config-monitor.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/lxqt-config.desktop]

8
debian/lxqt-config-l10n.install vendored Normal file
View File

@ -0,0 +1,8 @@
usr/share/lxqt/translations/lxqt-config
usr/share/lxqt/translations/lxqt-config-appearance
usr/share/lxqt/translations/lxqt-config-brightness
usr/share/lxqt/translations/lxqt-config-cursor
usr/share/lxqt/translations/lxqt-config-file-associations
usr/share/lxqt/translations/lxqt-config-input
usr/share/lxqt/translations/lxqt-config-locale
usr/share/lxqt/translations/lxqt-config-monitor

17
debian/lxqt-config.install vendored Normal file
View File

@ -0,0 +1,17 @@
usr/bin/lxqt-config
usr/bin/lxqt-config-appearance
usr/bin/lxqt-config-brightness
usr/bin/lxqt-config-file-associations
usr/bin/lxqt-config-input
usr/bin/lxqt-config-locale
usr/bin/lxqt-config-monitor
usr/lib/*/lxqt-config/liblxqt-config-cursor.so
usr/share/applications/lxqt-config-appearance.desktop
usr/share/applications/lxqt-config-brightness.desktop
usr/share/applications/lxqt-config-file-associations.desktop
usr/share/applications/lxqt-config-input.desktop
usr/share/applications/lxqt-config-locale.desktop
usr/share/applications/lxqt-config-monitor.desktop
usr/share/applications/lxqt-config.desktop
usr/share/icons/hicolor/48x48/apps/brightnesssettings.svg
usr/share/lxqt/icons/monitor.svg

4
debian/lxqt-config.lintian-overrides vendored Normal file
View File

@ -0,0 +1,4 @@
# This is expected
lxqt-config: desktop-entry-lacks-keywords-entry [usr/share/applications/*.desktop]
lxqt-config: desktop-entry-invalid-category LXQt [usr/share/applications/*.desktop]
lxqt-config: no-manual-page [usr/bin/*]

View File

@ -1 +0,0 @@
man/lxqt-config.1

3
debian/manpages vendored Normal file
View File

@ -0,0 +1,3 @@
usr/share/man/man1/lxqt-config-appearance.1
usr/share/man/man1/lxqt-config-input.1
usr/share/man/man1/lxqt-config.1

14
debian/rules vendored
View File

@ -1,11 +1,17 @@
#!/usr/bin/make -f
#export DH_VERBOSE=1
# export DH_VERBOSE=1
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
export LC_ALL=C.UTF-8
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
%:
dh ${@} --buildsystem cmake \
--parallel
dh ${@} --buildsystem cmake
override_dh_auto_configure:
dh_auto_configure -- \
-DPULL_TRANSLATIONS=OFF \
-DUPDATE_TRANSLATIONS=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo
override_dh_makeshlibs:
dh_makeshlibs -Xlxqt-config

2
debian/source/lintian-overrides vendored Normal file
View File

@ -0,0 +1,2 @@
# Translation files may be long
lxqt-config source: very-long-line-length-in-source-file * > 512 [*.ts:*]

5
debian/upstream/metadata vendored Normal file
View File

@ -0,0 +1,5 @@
Bug-Database: https://github.com/lxqt/lxqt-config/issues
Bug-Submit: https://github.com/lxqt/lxqt-config/issues/new
Changelog: https://github.com/lxqt/lxqt-config/blob/master/CHANGELOG
Repository: https://github.com/lxqt/lxqt-config.git
Repository-Browse: https://github.com/lxqt/lxqt-config

View File

@ -1,63 +1,52 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)
mQINBFJevCYBEACx+Hvy+Vsuf+V5jeLUnzjAmHoy8DfTeGWr3ts30IapLHrfi0+U
WpzNnISO77yTr4VNboVZH+GHM/rnPfieODfB4ZW6CZLlInMSKUXcgQsEqXpyBZhA
Ib/SPy2bOfHly1uRJes0uRDsH5+v/hD74sByfnjQlrvI68O6wvGZmDFMNNPVO8+/
OWBSBNkBuVrrZOMSPsLwQGJ4UtUQ4whburaPJG4VZJc5DLbzJGbEuACc0IAEYJS3
7AfXVXn4j4Gc9F3o1xTUnbOBnwGPquWwUIm3FM7Ec2OdkvMt3EwvnkMAfeVrq3iE
FDD/KZTxdL0BZH3QD8gB7Jm4v4f3Nkobg6JCvCbcH3wBdZW4mASbwWzfRaDC2zHb
ErTglD7PpShLKZZ0pr9okWZEGw4Ku3q8ALi1JXK/ePTmsBlvkVskOJ3Nnd0avgH4
+Q/vZoKfH8EhNY745rI+8CE9iv6V9XiSUt4CKEWAENt4A8hq6U2vV+jZv3B6AgD7
ZjiI59yD4YuYubu8rCnNizTgh1voVw3ietknn/x2H5yH8fByWZ5uL87C0ky/uma6
ZGbiiAtM4kdkyDMrfRV5nlEG9EKAGPVu5mjeSCrfkETwZ9OFPz1AuDye4ZEXrrcC
iRQ7RX6/GtW18aHER0kzGnfwx5KJzkDrRBY8A2PdXLBcrsN4WpK9EX01PQARAQAB
tCNKZXJvbWUgTGVjbGFuY2hlIDxqZXJvbWVAbGVjbGFuLmNoPokCPwQTAQIAKQUC
Ul68JgIbAwUJAeEzgAcLCQgHAwIBBhUIAgkKCwQWAgMBAh4BAheAAAoJEDfgrx/a
SPNzSHIP/1ewXcC0TFBcvDD7MrIP7anyNfiWfW7cxkR8GSamkg6HTa6Ndyr1FFjJ
OoDFUP37jWhu59CsHxs2D0zRWJktezfvElscRgqbHcdpIznqsGdI8hXCZafhBGVb
sdAB2LRawcXGxnXt7XajPcSVwLWRE62caBqohznU2iWvI780WNjEbZoA0LhZwaFF
UUPJm8ea9v0IkZVKUyg9WONZ1U7FEG9SaEiSpI8kJdx1fvCwZVDV/NRO5GqnJaho
P1LCne4YdwS6pt1/fRgk32IHxxZfHlLzLHxb6v1JmIg72x28qCmGyK9oFBDbbnYu
6Aq8XbHogOrD5vJM2Pfm2IhV0+JHOjfQbddv8tsAH1M+LI+tToXmg5st1AU3wnTn
pda3hjA1avKwkfBPW/osHc8782ViyS9iX2e9iDtMv608guij4NjpGExzGCypHOd8
+VXRwJDjvgDynkL206MZ+wn0j5wHsIE8F3Y5Bp1thQOrdDli5MYNQoXhjFmH46XT
bcr84IgW0+AiXZdoFUqvwtzrWy2Onuw5R3k4OyV4skN4DkWXyAk/V+Y4K39JvTKf
H9YuiQ9blNzCu8WiAnjKnh9kNl9E/TyEwI6cHFmIPqF8ST9tJytWHtrKvU9csvXX
n8XNJmpcv2R1e6N+VuWWm5zUPTouv3AxCacLbm8Lh3ymGsk7ZEyhiQIcBBABAgAG
BQJSsFYyAAoJEBMY76xfu9vO6v0P/3wSj3/kE4nP4HfgcVJSzi+lm1ycpbLDZtgh
P1G+zJLVmA+E41vEZimeiYQxBAelatJz+CHzQo3LZ2oVChzVrZcVHn9k4P3pib69
qCVif3/y0Wmecn+u2TWbOvJ7mthfO7T3W7rkW1/9ES7bUaXcXWQ2sjUBVqFkFsVt
xgJDo8wcxA+K4Yf06GCbxFwrB7X5GraWIkzqGnyse3XAQn8aORAXmE8Yd0FHOjEZ
Beb9shChnkYc3lEvNY8ioCaYSF9xr/Iz9cwpfPkpqFiVYWadtb+Gqeh6zC7vPmcT
zHxrgkq1WwQlSBm724tPt9xuGQoOglqEa23vlQZfv20nyrYjLeYUy6pMCRq7vn/n
nkQOcXF7yQlnqR6xKk0tWsM4e6du0ZvbjBbhHV/kBFVGCLm/upTwoMVm0WJTbr4T
5XfIZo7eA0lvGtUhe1PgcOidBikHfAIfYxu0BoMXoL4jbcQdR5+YBDEfsS0jPhCl
mew2ScW/R/UhUknJUVFTma0KHXzEmKiqeeUCDtwEi6fxdicAYkbcekgkfFiD/w8N
Lk3Uf+0x2MdKA36nUobFkk38oU+GW37kFWJs3f1YRuQFao896eNW/E8ekVMLNxOl
nCjnSbabaxDnxPTyW2KlNjf/QUEK4pT6S5QmuCSrle3PQpaSbAZDHzLBIL9gd3m6
MH7+SvV4uQINBFJevCYBEADiXDUqstSdhIyuionS2KtE3IeEBIqS7GY8QPRBylIZ
ACVHFI/1HxChBqYVGFaDEQn3gj5lUUQPubfWaxzjF6+UNVQW4+cxmTocndAwfDbI
+E5BLdieFUzbAA05MV5ZjPhTNbSk1jpy4bNy0FILwNqc89Y6SoCbv1r3tZLCrBas
1+AfWknBynx0siGMbLFxtzR6hUkNz9URxt13FrzpUWMpAL8ZQGczOTSaWLrZA5l9
xLzJ9ww8uM+C2Xej3/sANxi+kQE2GVMKurPS0TICwVWZxbdW/ytIkO67Rhse0q3t
vzjdawfCFRxv7XQB2ZJ6irDxbpHiJoojSWCHJadIyCG03iOiaqsSVvi4KnxtUck+
udOEJUV5sxdzgeRrsDpeaN//KCWW9WjfsSkvOqP6S1gmWpNFdzF5XrzcgvqvSNqo
XejfakUTJqsIIEHO0zGuJFVzJNh2hQ/9dhjIspUORhtNKaljNvePiBrj2yqmd9PY
FlH1KMHe4H+YVIwPiyeNA87Pu+1yNo8gT7mXhGRfibgWjbt146WUJ7+l2StJMApn
eNSCartNaUNPnw96i2l5c9AsJ3SWC6XWpWzOLVj+9XceeA11lu/ogqEMHzx81NjH
2TePxwKTKxZnAvDmqryp++IgY2/OgIoIk3ZRdYu/dPijTOYWfCet/9/9kAFr9PeJ
KwARAQABiQIlBBgBAgAPBQJSXrwmAhsMBQkB4TOAAAoJEDfgrx/aSPNzJv0QAKkx
lCKEZ6ahAUuNWslsHnNWaHFHNawEO3NIEtQZGVFk2BYISupizvjZF6MnymO/9UFM
pzV6fp3xNdqaKWQBjScOgMgCASRixW2tMAKbJGHZKp3dBixpHgXxy2oOGMS+mQ5m
gWy07usq2YesoMD0K/SG6EnoRPHBvrJihArzMFVUY9hD3hk8bhiy8w9bCYFe+gkm
zpQl3/KN01kyt5LjzEBcIOw8qIBQe9Pk8PyOK75lPoNME714LatgOsyw2kaSQ9Sv
hziRGC5z/fV3PmH7XhSjENPKnCJU51GUMMLaL28t9o7Afh6Q8UV31/JO36vmQXQV
+b+0BoGqEmf3AKBASb2Cr2q4pZFjywwSUXHZ9hQyu1tpbE1dS6aI01kM0y270pk7
W/ajuzuOxAVL1bJAanL/5+DWM03esZPVdEWhxpWEM40Z6Rhq+Xb2a5xfwCN9PmaQ
o9fez0I+yh53s7Ypv0tBj05FPe5L48+pDi6pz5nddN1B0FzF58jVfsBZUjBlY24+
VwQeAaWkRXZrSEdtBS5ufsi80x/cNCSTJBWqtborKL1iGgf5MDPYRMSvmZXAeIld
pyL/0pbW7iokewyKzpFfo7KEbwLxB+flWaBZ867JpF4yyRj3b4qcvcyV8QnsoB7Z
KhxTl3gGwD/t0HUcu85zcfs4GkealYhIWfGaAso2
=fF8P
mQINBF6cxrwBEADfl3ydxNfLBbWGPesXty2baQgixZ3D6aCxadI2kX+aikmT8rd0
ttDKN18cXV52Ssxnj0qhgf4hwnu/b0be6BzqSEyGM+UQR3X2CYpxrMakfW32Q18K
X5ec0RPR2ucBq9G0r9t6FYC8FkJ4uQUU3xxrLW3z302S0Makjgzm8BV9WrFQ7oFF
uJQj0BHbHYC4RyaZb2AfxY4Y92BPGTjtGekWqgw6vEXCCnvAbGYVQzvxZt3nw21/
1YmV4g7xhGFQPbOf9v3ejFUJeJIGzuJf5NAh7kvfCdUBAGYH0gnj0GpOve4ftnaG
sAId2CQwm3oYF4Tu7yBPTOBpkaKkNaT+UdwTyeKERuCZ9ocZWX++/YF9ItRkJ5mM
zoP1GluWn2atNWpRh/K97gyAGgr2fSmrAA4d1JrVbMujZAHoHAOKwJKqX9jPziPZ
BFHfhcIOzG3ZhXAuumHsd7uwfPBVt20g+G+cOjBghbSSu9EOtMkAZl1g3ybvZixu
Jtxa5exZWEmU7vtytEb8eq9Dj5XcGoTDbErE2RpJ/20HPzhyRKg9RN4iGS+0OiHS
oRbDi5IEOizvQjp2bsBmfa3rsoDSOqF2pevp+u8I56I6bU1GFpxxNC5IGvgo2Q79
quz0oIk5hs3eLlUdEYsLGwR6pWJaJyf36vuDsq7iLrLyvHI5irAowO4r1QARAQAB
tCVQZWRyYW0gUG91cmFuZyA8dHN1amFuMjAwMEBnbWFpbC5jb20+iQJOBBMBCAA4
FiEEGd/fOleb1QnbtXLYvnkwB60i334FAl6cxrwCGwMFCwkIBwIGFQoJCAsCBBYC
AwECHgECF4AACgkQvnkwB60i335f9RAAgRpn8gUa/l10UkVAnpM2Cz0MuNMwwCOq
IfVnuZuPBtYYiTU5Su++/aPZe3fF5B4v61F+XjNi7qeVL2t52X3jZ/iIx9Syasb+
vDAIfQ5t6lKXvOptWxf6vteOg6CHbXwpGHbPjUkUS2vQwRikjBnR0SnkrMoXtgSX
amPFqsitNrOhEJfeDfo0NzKESZuliWrCFt2v8c5q18G8cCZAvPLBlGuwRl58cDep
3EIibMI/9MUSJbKoiHlK+LcHtG7BQTNis/e7Pe1PkRmExfhxe1lNajtOx8FO72Tq
B6zY6drippM9VaIc1M+zp9BRpsFu8whOmapCqlXHRgAK8xTdQRIGInQFqLWPOxSC
f0B6N+EvQvgkyFQ1rW+u91OJBma46uKkhrwf+mDttVRncaIAkgE6e6pqm18yIPFk
D42rt/yHcOl+2qkcJS3gPcg5UvlCzqOwg1rKZQIk+TcPuDx3r2UghDEYZN9X6vw3
zCBufr7ygZNf4tkbnVARFWTR4GzyCseFkWgOVZL9DccAhs8NeMy1WLkUzB75adeR
3LONmEL7xOI8FuknKY4e6EcWhmstNIDgXfRe0hwO0VBdW3unoZC/K2ZM/ZuZyMdK
TFjvYJrNewmymKge68wo0054bGZn8oz17i2AosJz7kW+ITsxmxhVcpfl4bav9Neq
RpQwhnhK9bC5Ag0EXpzGvAEQANbeRHFbpgQVIqV9WVOVnTj4FIqrTPTPKKa02vJA
7tGpgFapgvjdxnMxJfV6wuwOBUUFLR7DrXlV8EVFAYc5qTIeSQXvJsWw6gQ3+f0D
z13oGOhZPBIzIKnV/MZI/jhIio8kSPWAuM5hR2X9Hvw3/CLo+H+hZZ6cFYoCxrQS
tTzcKMkdQizLLa+WNbqUSxg6I/P5k/smUDY9gKW7RtI5t/PupA3WTnsVD6CYWa3Q
c1O/1mUgqT6nQ5N9KCPpjZQRT6D6eIMmePtS85z4PPeYMJxPsKRYWPGRxKhCSdZl
/0wsC8aRtmwYT729e0ZgTAmUnj+rQp5hboF/ZPFjIoXR9G+0HnoY0a/nqVO4lUON
AV25GnMFGVyiHHlbH/0gboywwnzEg8BZbk+Z/61oOzBIW09sfG8fn8bsbkpL+nHf
Mi/Vauge6wSfw7I5AfSiwrSDNHmKVsu39koWV6JGxEeFr2MffF+CuaoJCNOr/ZII
SYR5ku3Y/lMKyUH1Oas0RWzFrdRcInqYK90A0x083zP4V445MvCwbRPzQAkm9wOP
kILLhE5FW+9/O0/9bpx4joJUDLV4d3hFZy7GSHKiZUs1QW6BV75JQKqoi+cVt+/L
+o1S8CMNekjqdC2mWRosM3doo51zT/FWNzQA1QcoZP2hORJDfw66y+4wPq6o8y1W
jR35ABEBAAGJAjYEGAEIACAWIQQZ3986V5vVCdu1cti+eTAHrSLffgUCXpzGvAIb
DAAKCRC+eTAHrSLffgbJD/4qW5YOo/BayBhaUh2L7VP7JNlECb/2xNNOFKI1NjNr
nOmgSJLzf74Uhmt5W+iVjmJBHrDceprIPkizmPrn90kIsPIMtHIDNxzUgKZHbnza
j1vZyAeC+JV79X1hOVpprj1TJwy65lpxXNyYnGqeIOgyFokn9fOHXv8aMQwpNuUr
bdUJ1C75jYrvwy/NR1DczIFFYgsbkDGDtjVBjyMc5JAgvUBz37/iVPJfWP6dKVnf
abRnUVzHgvgK7bnab00SA1TiWvjHURGjo+5rnRtv8X/AgStc2Phjq68TMIgMn0F2
kjUVvfQotNqzo9madNshvUDmsGtAzKh4e0dS1ear7u3nRp4Z7fqSrTEtXKNbEPwZ
wdWrWmmQLacNQBSe/FtcMzGF6xIVr4lnrL0bFjqBdQpdTC7vns3QSKk8/GFiEfpv
kzXrDbGV7jX2OWDjNHKcmXX2+E1CsNaJgS7zOgZw5jvbvlTLJUwyYNlM1VLI2OFW
Oa86l8pqli+B7rpTbsAE9Ut8qUaWjm87oUNSJbaKgqNnMaE+b/8VJaEeWHgQJwsD
bJSJ/O/vzlRtDjOJ1JDlMRLs7TnOFeUh5pgwyaJoidYbJEiGlMGJbI6BjwhDTBFO
NLJtd3SsRjc7ICtGdCvej59IvCDTjxtkhx5okF03APi1aXpHQrE18/arFD7BpoGO
sw==
=gSIv
-----END PGP PUBLIC KEY BLOCK-----

8
debian/watch vendored
View File

@ -1,3 +1,5 @@
version=3
opts="pgpsigurlmangle=s/$/.asc/" \
https://github.com/lxde/lxqt-config/releases .*/([\d\.]+).tar.gz
version=4
opts="searchmode=plain, \
pgpsigurlmangle=s/$/.asc/, \
uversionmangle=s/(\d+\.\d+\.\d+).*/$1/" \
https://api.github.com/repos/lxqt/@PACKAGE@/releases https:\/\/github.com\/lxqt\/@PACKAGE@\/releases\/download\/@ANY_VERSION@\/@PACKAGE@-@ANY_VERSION@.tar.xz

View File

@ -1,90 +0,0 @@
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 (
${X11_INCLUDE_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
selectwnd.ui
warninglabel.ui
)
find_package(ZLIB REQUIRED)
# 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}
${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
${ZLIB_LIBRARY}
${X11_Xfixes_LIB}
)
# not needed probably ${X11_Xfixes_LIB})
install(TARGETS
lxqt-config-cursor
DESTINATION "${CMAKE_INSTALL_LIBDIR}/${LXQT_CONFIG_PROJECT}"
COMPONENT Runtime
)
install(FILES
${DESKTOP_FILES}
DESTINATION "${CMAKE_INSTALL_DATAROOTDOR}/applications"
COMPONENT Runtime
)

View File

@ -1,122 +0,0 @@
/* 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;
}

View File

@ -1,20 +0,0 @@
/* 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

View File

@ -1,276 +0,0 @@
/* 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());
}

View File

@ -1,119 +0,0 @@
/* 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

View File

@ -1,141 +0,0 @@
/* 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();
}

View File

@ -1,48 +0,0 @@
/* 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

View File

@ -1,42 +0,0 @@
/* 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();
}

View File

@ -1,19 +0,0 @@
/* 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

View File

@ -1,39 +0,0 @@
.TH lxqt-config-cursor "1" "September 2012" "LXQt\ 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 is a simple GUI cursor theme configuration (at the moment) for the LXQt desktop environment.
Also can manage theme installation for it (locally 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/lxqt/issues
.SH "SEE ALSO"
\fBLXQt\fR 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.

View File

@ -1,221 +0,0 @@
/* 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;
}

View File

@ -1,60 +0,0 @@
/* 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

View File

@ -1,229 +0,0 @@
/* 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 &current, 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"));
}

View File

@ -1,60 +0,0 @@
/* 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>
#include <lxqtglobals.h>
namespace LXQt {
class Settings;
}
class XCursorThemeModel;
#include "ui_selectwnd.h"
class LXQT_API 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 &current, const QModelIndex &previous);
void on_btInstall_clicked ();
void on_btRemove_clicked ();
void handleWarning();
void showDirInfo();
private:
XCursorThemeModel *mModel;
QPersistentModelIndex mAppliedIndex;
LXQt::Settings* mSettings;
};
#endif

View File

@ -1,114 +0,0 @@
<?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). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</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>&amp;Install New Theme...</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QPushButton" name="btRemove">
<property name="text">
<string>&amp;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>

View File

@ -1,328 +0,0 @@
/* 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();
}

View File

@ -1,116 +0,0 @@
/* 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

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,77 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ar">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>اعداد شكل فأرة سطح ريزر</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>اختر سكل المؤشِّر الذي تريد استخدامه (مرر المؤشِّر متخطيَّاً لمعاينته).
&lt;b&gt;يجب إعادة تشغيل جلسة سطح ريزر بعد هذا التَّغيير&lt;/b&gt;</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>تث&amp;بيت واجهةٍ شكليَّةٍ جديدةٍ...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">ت^عيين الواجهة الشَّكليَّة</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>إ&amp;زالة الواجهة الشَّكليَّة</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">إ&amp;غلاق</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>
<source>XCurTheme error</source>
<translation>خطأٌ في الواجهة الشَّكليَّة للمؤشر الرسوميّ</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="209"/>
<source>You can&apos;t remove active theme!</source>
<translation> يمكنك إزالة واجهةٍ مفعَّلةٍ</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="cs">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Nastavení motivu myši</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Vyberte motiv ukazovátka, jejž chcete používat (přejeďte myší nad náhledem kvůli vyzkoušení ukazovátka). &lt;b&gt;Sezení LXQt je potřeba po této změně spustit znovu&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>Na&amp;instalovat nový motiv...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Nastavit motiv</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Odstranit motiv</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Nemůžete odstranit právě nastavený motiv</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="cs_CZ">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Nastavení motivu myši</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Vyberte motiv ukazovátka, jejž chcete používat (přejeďte myší nad náhledem kvůli vyzkoušení ukazovátka). &lt;b&gt;Sezení LXQt je potřeba po této změně spustit znovu&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>Na&amp;instalovat nový motiv...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Nastavit motiv</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Odstranit motiv</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Nemůžete odstranit právě nastavený motiv</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,77 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="da_DK">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt Musemarkør Tema Indstillinger</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Vælg det markør tema, du vil bruge (forhåndsvisning for at teste markør).
&lt;b&gt; LXQt session skal genstartes efter denne ændring &lt;/ b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Installer Nyt Tema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Sæt Tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Fjern Tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Det aktive tema kan ikke fjernes!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt Mauszeigerdesign Konfiguration</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Wähle das gewünschte Mauszeigerdesign aus (zum Test Maus über Vorschau bewegen)
&lt;b&gt;Die LXQt-Sitzung muss nach dieser Veränderung neu gestartet werden&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Neues Design installieren...</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>D&amp;esign entfernen</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&apos;t remove active theme!</source>
<translation>Das aktive Design kann nicht entfernt werden!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Dialogfenster</translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="el">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Διαμόρφωση θέματος ποντικιού LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Επιλέξτε το θέμα του δρομέα που θέλετε να χρησιμοποιήσετε (κινηθείτε επάνω για προεπισκόπηση). &lt;b&gt;Χρειάζεται επανεκκίνηση της συνεδρίας LXQt μετά την αλλαγή&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Εγκατάσταση νέου θέματος...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">Ε&amp;πιλογή θέματος</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Αφαίρεση θέματος</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;Κλείσιμο</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>
<source>XCurTheme error</source>
<translation>Σφάλμα του θέματος δρομέα X</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="209"/>
<source>You can&apos;t remove active theme!</source>
<translation>Δεν μπορείτε να αφαιρέσετε το ενεργό θέμα!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Παράθυρο διαλόγου</translation>
</message>
<message>
<location filename="../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 δεν μπόρεσε να βρει κάποιο θέμα δρομέα. Θα χρησιμοποιηθεί ο εξ ορισμού δρομέας X11. Το LXQt έψαξε στους παρακάτω καταλόγους:</translation>
</message>
<message>
<location filename="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="eo">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Agordoj de etosoj de muso de LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Elektu la etoson de kursoro, kiun vi volas uzi (ŝveba antaŭrigardo por testi kursoron). &lt;b&gt;Seanco de LXQt postulas restartigon post ol ĉi tiu ŝanĝo&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instali novan etoson...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">Agordi eto&amp;son</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Fo&amp;rigi etoson</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Vi ne povas forigi aktivan etoson!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es">
<context>
<name>SelectWnd</name>
<message>
<location filename="../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="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Seleccione el tema del cursor que desea utilizar (pase el cursor para una vista previa). &lt;b&gt;LXQt necesita reiniciar la sesión después de este cambio &lt;/ b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalar Nuevo Tema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Establecer Tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Quitar Tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>¡No puedes quitar el tema activo!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es_VE">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Configuracion de tema de raton de LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Selecciona el cursor del raton que tu desees usar (colocalo encima para ver una previsualizacion) &lt;b&gt;La sesion de LXQt necesita reinicializarse despues de un cambio&lt;/b&gt;</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalar nuevo tema</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">A&amp;Signar el tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Remover el tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>No puedes remover el tema activo!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="eu">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt saguaren gaiaren konfigurazioa</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Hautatu erabili nahi duzun kurtsore-gaia (nabarmendu aurrebista kurtsorea probatzeko). &lt;b&gt;LXQt saioa berrabiarazi behar da aldaketa honen ondoren&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalatu gai berria...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Ezarri gaia</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Kendu gaia</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Ezin duzu gai aktiboa kendu!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fi">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQtin hiiriteeman asetukset</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Valitse haluamasi osoitinteema (käytä esikatselua testataksesi osoitinteemaa). &lt;b&gt;LXQt-istunto tulee käynnistää uudelleen tämän muutoksen jälkeen&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Asenna uusi teema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">Aseta &amp;teema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Poista teema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Käytössä olevaa teemaa ei voi poistaa!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr_FR">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="hu_HU">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt egértéma</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>A kívánt kurzortéma (előzetesen látható). &lt;b&gt;Érvénybeléptetéshez az LXQt munkamenet újraindíttandó&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Új téma telepítése...</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Téma kiny&amp;írása</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;Bezárás</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>
<source>XCurTheme error</source>
<translation>Témahiba</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="209"/>
<source>You can&apos;t remove active theme!</source>
<translation>Az aktuális téma eltávolíthatatlan!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Ürlap</translation>
</message>
<message>
<location filename="../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>Az LXQt nem lelt kurzor témát, az alapértelmezett lesz használva. Ezekben a mappákban kereste:</translation>
</message>
<message>
<location filename="../warninglabel.ui" line="54"/>
<source>Show...</source>
<translation>Mutat...</translation>
</message>
</context>
<context>
<name>XCursorThemeModel</name>
<message>
<location filename="../thememodel.cpp" line="61"/>
<source>Name</source>
<translation>Név</translation>
</message>
<message>
<location filename="../thememodel.cpp" line="62"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
</context>
</TS>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="hu_HU">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt egértéma</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>A kívánt kurzortéma (előzetesen látható). &lt;b&gt;Érvénybeléptetéshez az LXQt munkamenet újraindíttandó&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Új téma telepítése...</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Téma kiny&amp;írása</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;Bezárás</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>
<source>XCurTheme error</source>
<translation>Témahiba</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="209"/>
<source>You can&apos;t remove active theme!</source>
<translation>Az aktuális téma eltávolíthatatlan!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Űrlap</translation>
</message>
<message>
<location filename="../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>Az LXQt nem lelt kurzor témát, az alapértelmezett lesz használva. Ezekben a mappákban kereste:</translation>
</message>
<message>
<location filename="../warninglabel.ui" line="54"/>
<source>Show...</source>
<translation>Mutat...</translation>
</message>
</context>
<context>
<name>XCursorThemeModel</name>
<message>
<location filename="../thememodel.cpp" line="61"/>
<source>Name</source>
<translation>Név</translation>
</message>
<message>
<location filename="../thememodel.cpp" line="62"/>
<source>Description</source>
<translation>Leírás</translation>
</message>
</context>
</TS>

View File

@ -1,78 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="it_IT">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Configurazione del aspetto del cursore</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translatorcomment>hover seems not working, and restart seems not necessary to take effect</translatorcomment>
<translation>Seleziona il tema del cursore che vuoi utilizzare </translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translatorcomment>&amp; to remove in source</translatorcomment>
<translation>Installa un nuovo tema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Imposta il tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Rimuovi il tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;Chiudi</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="208"/>
<source>XCurTheme error</source>
<translation>Errore tema X-cursore</translation>
</message>
<message>
<location filename="../selectwnd.cpp" line="209"/>
<source>You can&apos;t remove active theme!</source>
<translation>Non puoi rimuovere il tema attivo!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../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 non ha trovato nessun tema per i cursori in queste directories: (Verrà usato il tema di default di X11):</translation>
</message>
<message>
<location filename="../warninglabel.ui" line="54"/>
<source>Show...</source>
<translation>Mostra...</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>

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ja">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQtマウステーマの設定</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>使 (). &lt;b&gt;LXQtセッションはこの変更後に再起動が必要です&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>...(&amp;I)</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>(&amp;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&apos;t remove active theme!</source>
<translation>!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="lt">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="nl">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pl_PL">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Wygląd kursora</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Wybierz motyw kursora (najedz kursorem na podgląd by przetestować). &lt;b&gt;Wymagane jest ponowne uruchomienie sesji&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Zainstaluj Nowy Motyw...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Wybierz Motyw</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Usuń Motyw</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Nie możesz usunąć aktywnego motywu!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Uwaga</translation>
</message>
<message>
<location filename="../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>Nie znaleziono żadnego motywu kursora. Zostanie użyty domyślny motyw kursora X11. LXQt wyszukiwało w następujących katalogach:</translation>
</message>
<message>
<location filename="../warninglabel.ui" line="54"/>
<source>Show...</source>
<translation>Pokaż...</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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pt">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Definições do tema de cursor do LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Escolha o tema de cursor a utilizar (passe com o rato para testar). &lt;b&gt;Tem que reiniciar o LXQt a sessão após a alteração&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalar novo tema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Definir tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Remover tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">Fe&amp;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&apos;t remove active theme!</source>
<translation>Não pode remover o tema ativo!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation>Formulário</translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="pt_BR">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Configuração Do Tema Do Mouse</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Selecione o tema do cursor que você deseja usar (pairar visualização para testar o cursor). &lt;b&gt;A sessão LXQt precisa reiniciar após esta mudança&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalar Novo Tema...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Definir Tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Remover Tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation>Você não pode remover o tema ativo!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ro_RO">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Configurare temă maus LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Selectați tema de cursor pe care doriți o utilizați (treceți peste cu mausul pentru a testa cursorul)&lt;/b&gt;Sesiunea LXQt necesită o repornire după această modificare&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Instalează temă nouă...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Setează tema</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Elimină tema</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">În&amp;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&apos;t remove active theme!</source>
<translation>Nu se poate elimina tema activă!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Настройка темы курсора LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Выберите тему курсора, которую вы хотите использовать (наведите курсор на область предварительного просмотра для проверки). &lt;b&gt;Сессию LXQt нужно перезапустить после изменений&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Установить новую тему</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Удалить тему</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&apos;t remove active theme!</source>
<translation>Невозможно удалить активную тему!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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 не смог найти какую-нибудь тему курсора. Будет использована тема X11 по-умолчанию. LXQt искал в следующих папках:</translation>
</message>
<message>
<location filename="../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>

View File

@ -1,68 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru_RU">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Настройка темы курсора LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Выберите тему курсора, которую вы хотите использовать (наведите курсор на область предварительного просмотра для проверки). &lt;b&gt;Сессию LXQt нужно перезапустить после изменений&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Установить новую тему</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;Удалить тему</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&apos;t remove active theme!</source>
<translation>Невозможно удалить активную тему!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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 не смог найти какую-нибудь тему курсора. Будет использована тема X11 по-умолчанию. LXQt искал в следующих папках:</translation>
</message>
<message>
<location filename="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="sl">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="th_TH">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation> LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation> (). &lt;b&gt; LXQt &lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>&amp;</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;</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&apos;t remove active theme!</source>
<translation></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="tr">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;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&apos;t remove active theme!</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="uk">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>Налаштування тем миші LXQt</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>Оберіть тему курсорів, яку Ви бажаєте використовувати (наведіть на попереднй перегляд для перевірки курсору). &lt;b&gt;Сеанс LXQt потребує перезапуску щоб ці зміни подіяли&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>&amp;Встановити нову тему...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">&amp;Призначити тему</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>Вилу&amp;чити тему</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;Закрити</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&apos;t remove active theme!</source>
<translation>Неможливо вилучити активну тему!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>Ім&apos;я</translation>
</message>
<message>
<location filename="../thememodel.cpp" line="62"/>
<source>Description</source>
<translation>Опис</translation>
</message>
</context>
</TS>

View File

@ -1,76 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt </translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation>使()&lt;b&gt;LXQt &lt;/b&gt;</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>(&amp;I)...</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">(&amp;S)</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>(&amp;R)</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">&amp;</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&apos;t remove active theme!</source>
<translation>使</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,77 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_TW">
<context>
<name>SelectWnd</name>
<message>
<location filename="../selectwnd.ui" line="14"/>
<source>LXQt Mouse Theme Configuration</source>
<translation>LXQt滑鼠游標主題設定</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="20"/>
<source>Select the cursor theme you want to use (hover preview to test cursor). &lt;b&gt;LXQt session needs restart after this change&lt;/b&gt;:</source>
<translation> ()
&lt;b&gt;LXQt會話&lt;/b&gt;:</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="81"/>
<source>&amp;Install New Theme...</source>
<translation>...(&amp;I)</translation>
</message>
<message>
<source>&amp;Set Theme</source>
<translation type="vanished">(&amp;S)</translation>
</message>
<message>
<location filename="../selectwnd.ui" line="88"/>
<source>&amp;Remove Theme</source>
<translation>(&amp;R)</translation>
</message>
<message>
<source>&amp;Close</source>
<translation type="vanished">(&amp;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&apos;t remove active theme!</source>
<translation>!</translation>
</message>
</context>
<context>
<name>WarningLabel</name>
<message>
<location filename="../warninglabel.ui" line="14"/>
<source>Form</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../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="../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>

View File

@ -1,43 +0,0 @@
/* 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()));
}

View File

@ -1,47 +0,0 @@
/* 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

View File

@ -1,64 +0,0 @@
<?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>

View File

@ -1,262 +0,0 @@
/* 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;
}

View File

@ -1,116 +0,0 @@
/* 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

View File

@ -1,742 +0,0 @@
/* 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;
}

View File

@ -1,97 +0,0 @@
/* 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

View File

@ -1,400 +0,0 @@
/* 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;
}

View File

@ -1,40 +0,0 @@
/* 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

View File

@ -1,352 +0,0 @@
/* 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;
}

View File

@ -1,31 +0,0 @@
/* 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

View File

@ -1,247 +0,0 @@
/* 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;
}

View File

@ -1,40 +0,0 @@
/* 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

View File

@ -1,92 +0,0 @@
project(lxqt-config-appearance)
include_directories(
${Qt5Gui_PRIVATE_INCLUDE_DIRS}
"${CMAKE_CURRENT_SOURCE_DIR}/../liblxqt-config-cursor"
"${CMAKE_CURRENT_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
lxqt
)
# 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)
#************************************************
add_executable(${PROJECT_NAME}
${CPP_FILES}
${RESOURCES}
${QRC_FILES}
${QM_FILES}
${QM_LOADER}
${DESKTOP_FILES}
)
target_link_libraries(${PROJECT_NAME}
Qt5::Widgets
Qt5::X11Extras
Qt5::Xml
${LIBRARIES}
lxqt-config-cursor
)
set_target_properties("${PROJECT_NAME}"
PROPERTIES
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/${LXQT_CONFIG_PROJECT}"
)
install(TARGETS
${PROJECT_NAME}
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
COMPONENT Runtime
)
install(FILES
${DESKTOP_FILES}
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications"
COMPONENT Runtime
)

View File

@ -1,235 +0,0 @@
/*
* 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);
}
}

View File

@ -1,86 +0,0 @@
/*
* 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

View File

@ -1,196 +0,0 @@
/* 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),
mQtSettings(qtSettings),
mSettings(settings),
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();
}

View File

@ -1,70 +0,0 @@
/* 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

View File

@ -1,261 +0,0 @@
<?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">
<property name="minimum">
<number>4</number>
</property>
</widget>
</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>

View File

@ -1,165 +0,0 @@
/* 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 <QStringBuilder>
#include <QIcon>
#include <QDebug>
#include <private/qtxdg/qiconloader_p.h>
using namespace QtXdg;
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();
static const QStringList iconNames = QStringList()
<< QStringLiteral("document-open")
<< QStringLiteral("document-new")
<< QStringLiteral("edit-undo")
<< QStringLiteral("media-playback-start");
const int iconNamesN = iconNames.size();
iconThemeList->setColumnCount(iconNamesN + 2);
QList<QTreeWidgetItem *> items;
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((QTreeWidget*)0);
item->setSizeHint(0, QSize(42,42)); // make icons non-cropped
item->setData(0, Qt::UserRole, theme.name());
const QVector<QIcon> icons = theme.icons(iconNames);
const int K = icons.size();
for (int i = 0; i < K; ++i)
{
item->setIcon(i, icons.at(i));
}
QString themeDescription;
if (theme.comment().isEmpty())
{
themeDescription = theme.text();
}
else
{
themeDescription = theme.text() % QStringLiteral(" (") % theme.comment() % QStringLiteral(")");
}
item->setText(iconNamesN + 1, themeDescription);
items.append(item);
}
}
}
}
QIconLoader::instance()->updateSystemTheme();
iconThemeList->insertTopLevelItems(0, items);
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);
// An hack to ensure that this widget also re loads it's own icons
// from the selected icon theme.
QIconLoader::instance()->setThemeName(QString());
m_settings->setValue("icon_theme", theme);
m_settings->sync();
}
}

View File

@ -1,58 +0,0 @@
/* 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

View File

@ -1,88 +0,0 @@
<?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>

View File

@ -1,166 +0,0 @@
/* 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>
* Luis Pereira <luis.artur.pereira@gmail.com>
*
* The directoryMatchesSize() and thedirectorySizeDistance() functions were
* taken from Qt5 qtbase/src/gui/image/qiconloader.cpp
* Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
*
* 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>
#include <private/qtxdg/qiconloader_p.h>
#include <QStringBuilder>
#define PREVIEW_ICON_SIZE 22
using namespace QtXdg;
/*
* This algorithm is defined by the freedesktop spec:
* http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
*/
static bool directoryMatchesSize(const QIconDirInfo &dir, int iconsize)
{
if (dir.type == QIconDirInfo::Fixed) {
return dir.size == iconsize;
} else if (dir.type == QIconDirInfo::Scalable) {
return dir.size <= dir.maxSize &&
iconsize >= dir.minSize;
} else if (dir.type == QIconDirInfo::Threshold) {
return iconsize >= dir.size - dir.threshold &&
iconsize <= dir.size + dir.threshold;
}
Q_ASSERT(1); // Not a valid value
return false;
}
/*
* This algorithm is defined by the freedesktop spec:
* http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
*/
static int directorySizeDistance(const QIconDirInfo &dir, int iconsize)
{
if (dir.type == QIconDirInfo::Fixed) {
return qAbs(dir.size - iconsize);
} else if (dir.type == QIconDirInfo::Scalable) {
if (iconsize < dir.minSize)
return dir.minSize - iconsize;
else if (iconsize > dir.maxSize)
return iconsize - dir.maxSize;
else
return 0;
} else if (dir.type == QIconDirInfo::Threshold) {
if (iconsize < dir.size - dir.threshold)
return dir.minSize - iconsize;
else if (iconsize > dir.size + dir.threshold)
return iconsize - dir.maxSize;
else return 0;
}
Q_ASSERT(1); // Not a valid value
return INT_MAX;
}
IconThemeInfo::IconThemeInfo(const QDir &dir):
mValid(false),
mHidden(false)
{
mName = dir.dirName();
if (dir.exists(QStringLiteral("index.theme")))
load(dir.absoluteFilePath(QStringLiteral("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(QStringLiteral("Icon Theme/Directories")).toStringList().join(QLatin1Char(' ')).isEmpty())
return;
mHidden = file.value(QStringLiteral("Icon Theme/Hidden"), false).toBool();
mText = file.value(QStringLiteral("Icon Theme/Name")).toString();
mComment = file.value(QStringLiteral("Icon Theme/Comment")).toString();
mValid = true;
}
QVector<QIcon> IconThemeInfo::icons(const QStringList &iconNames) const
{
QVector<QIcon> icons;
const QString currentThemeName = QIconLoader::instance()->themeName();
QIconLoader::instance()->setThemeName(mName);
foreach (const QString &i, iconNames) {
QThemeIconInfo info = QIconLoader::instance()->loadIcon(i);
if (!info.entries.isEmpty()) {
const int numEntries = info.entries.size();
// Search for exact matches first
bool found = false;
for (int i = 0; i < numEntries; ++i) {
QIconLoaderEngineEntry *entry = info.entries.at(i);
icons.append(QIcon(entry->filename));
found = true;
break;
}
if (!found) { // No exact match. Search for an approximation
// Find the minimum distance icon
int minimalSize = INT_MAX;
QIconLoaderEngineEntry *closestMatch = 0;
for (int i = 0; i < numEntries; ++i) {
QIconLoaderEngineEntry *entry = info.entries.at(i);
int distance = directorySizeDistance(entry->dir, PREVIEW_ICON_SIZE);
if (distance < minimalSize) {
minimalSize = distance;
closestMatch = entry;
}
}
icons.append(QIcon(closestMatch->filename));
}
} else {
icons.append(QIcon());
}
}
QIconLoader::instance()->setThemeName(currentThemeName);
return icons;
}

View File

@ -1,65 +0,0 @@
/* 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>
#include <QVector>
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; }
QVector<QIcon> icons(const QStringList &iconNames) const;
private:
QString mFileName;
QString mName;
QString mText;
QString mComment;
bool mValid;
bool mHidden;
void load(const QString &fileName);
};
#endif // ICONTHEMEINFO_H

View File

@ -1,11 +0,0 @@
[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=LXQt;
#TRANSLATIONS_DIR=translations

View File

@ -1,109 +0,0 @@
/* 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();
}
}
}

View File

@ -1,59 +0,0 @@
/* 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

View File

@ -1,58 +0,0 @@
<?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>

View File

@ -1,77 +0,0 @@
/* 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::Settings* sessionSettings = new LXQt::Settings("session");
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(sessionSettings, 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();
}

View File

@ -1,50 +0,0 @@
.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/lxqt/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.

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