Import Upstream version 5.24.4
This commit is contained in:
commit
c6fa9636d4
|
@ -0,0 +1 @@
|
|||
29029dd8e96606f86067be2a5e7a16bb11e52790
|
|
@ -0,0 +1,28 @@
|
|||
# Ignore the following files
|
||||
*~
|
||||
*.[oa]
|
||||
*.diff
|
||||
*.kate-swp
|
||||
*.kdev4
|
||||
.kdev_include_paths
|
||||
*.kdevelop.pcs
|
||||
*.moc
|
||||
*.moc.cpp
|
||||
*.orig
|
||||
*.user
|
||||
.*.swp
|
||||
.swp.*
|
||||
Doxyfile
|
||||
Makefile
|
||||
avail
|
||||
random_seed
|
||||
/build*/
|
||||
CMakeLists.txt.user*
|
||||
*.unc-backup*
|
||||
.clang-format
|
||||
/build*/
|
||||
/compile_commands.json
|
||||
.clangd
|
||||
.idea
|
||||
/cmake-build*
|
||||
.cache
|
|
@ -0,0 +1,6 @@
|
|||
# SPDX-FileCopyrightText: None
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
include:
|
||||
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/linux.yml
|
||||
- https://invent.kde.org/sysadmin/ci-utilities/raw/master/gitlab-templates/freebsd.yml
|
|
@ -0,0 +1,11 @@
|
|||
# SPDX-FileCopyrightText: None
|
||||
# SPDX-License-Identifier: CC0-1.0
|
||||
|
||||
Dependencies:
|
||||
- 'on': ['@all']
|
||||
'require':
|
||||
'frameworks/extra-cmake-modules': '@latest'
|
||||
'frameworks/kguiaddons': '@latest'
|
||||
'frameworks/kidletime': '@latest'
|
||||
'frameworks/kwayland': '@latest'
|
||||
'frameworks/kwindowsystem': '@latest'
|
|
@ -0,0 +1,63 @@
|
|||
project(kwayland-integration)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
|
||||
set(PROJECT_VERSION "5.24.4")
|
||||
set(PROJECT_VERSION_MAJOR 5)
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
set(QT_MIN_VERSION "5.15.0")
|
||||
set(KF5_MIN_VERSION "5.86")
|
||||
set(KDE_COMPILERSETTINGS_LEVEL "5.82")
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
find_package(ECM ${KF5_MIN_VERSION} REQUIRED NO_MODULE)
|
||||
|
||||
include(FeatureSummary)
|
||||
|
||||
# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} )
|
||||
|
||||
|
||||
find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS
|
||||
Core
|
||||
Widgets
|
||||
WaylandClient
|
||||
XkbCommonSupport # Needed by Qt5::WaylandClientPrivate
|
||||
)
|
||||
|
||||
include(KDEInstallDirs)
|
||||
include(KDECMakeSettings)
|
||||
include(KDECompilerSettings NO_POLICY_SCOPE)
|
||||
include(ECMQtDeclareLoggingCategory)
|
||||
include(KDEClangFormat)
|
||||
include(KDEGitCommitHooks)
|
||||
|
||||
# required frameworks
|
||||
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS
|
||||
IdleTime
|
||||
WindowSystem
|
||||
GuiAddons
|
||||
Wayland
|
||||
)
|
||||
|
||||
find_package(QtWaylandScanner REQUIRED)
|
||||
find_package(WaylandProtocols 1.21 REQUIRED)
|
||||
find_package(Wayland 1.15 COMPONENTS Client)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
|
||||
#add_definitions(-DQT_DISABLE_DEPRECATED_BEFORE=0x060000)
|
||||
|
||||
add_subdirectory(src)
|
||||
if(BUILD_TESTING)
|
||||
add_subdirectory(autotests)
|
||||
endif()
|
||||
|
||||
# add clang-format target for all our real source files
|
||||
file(GLOB_RECURSE ALL_CLANG_FORMAT_SOURCE_FILES *.cpp *.h)
|
||||
kde_clang_format(${ALL_CLANG_FORMAT_SOURCE_FILES})
|
||||
kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT)
|
||||
|
||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
|
@ -0,0 +1,446 @@
|
|||
GNU LIBRARY GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc.
|
||||
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the library GPL. It is numbered 2 because
|
||||
it goes with version 2 of the ordinary GPL.]
|
||||
|
||||
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 Library General Public License, applies to some specially
|
||||
designated Free Software Foundation software, and to any other libraries whose
|
||||
authors decide to use it. You can use it for your libraries, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, 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 or use pieces of it in new free programs; and that
|
||||
you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid anyone to
|
||||
deny you these rights or to ask you to surrender the 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
|
||||
a program 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.
|
||||
|
||||
Our method of protecting your rights has two steps: (1) copyright the library,
|
||||
and (2) offer you this license which gives you legal permission to copy, distribute
|
||||
and/or modify the library.
|
||||
|
||||
Also, for each distributor's protection, we want to make certain that everyone
|
||||
understands that there is no warranty for this free library. If the library
|
||||
is modified by someone else and passed on, we want its recipients to know
|
||||
that what they have is not the original version, so that any problems introduced
|
||||
by others will not reflect on the original authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software patents. We
|
||||
wish to avoid the danger that companies distributing free software will individually
|
||||
obtain patent licenses, thus in effect transforming the program into proprietary
|
||||
software. To prevent this, we have made it clear that any patent must be licensed
|
||||
for everyone's free use or not licensed at all.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the ordinary GNU
|
||||
General Public License, which was designed for utility programs. This license,
|
||||
the GNU Library General Public License, applies to certain designated libraries.
|
||||
This license is quite different from the ordinary one; be sure to read it
|
||||
in full, and don't assume that anything in it is the same as in the ordinary
|
||||
license.
|
||||
|
||||
The reason we have a separate public license for some libraries is that they
|
||||
blur the distinction we usually make between modifying or adding to a program
|
||||
and simply using it. Linking a program with a library, without changing the
|
||||
library, is in some sense simply using the library, and is analogous to running
|
||||
a utility program or application program. However, in a textual and legal
|
||||
sense, the linked executable is a combined work, a derivative of the original
|
||||
library, and the ordinary General Public License treats it as such.
|
||||
|
||||
Because of this blurred distinction, using the ordinary General Public License
|
||||
for libraries did not effectively promote software sharing, because most developers
|
||||
did not use the libraries. We concluded that weaker conditions might promote
|
||||
sharing better.
|
||||
|
||||
However, unrestricted linking of non-free programs would deprive the users
|
||||
of those programs of all benefit from the free status of the libraries themselves.
|
||||
This Library General Public License is intended to permit developers of non-free
|
||||
programs to use free libraries, while preserving your freedom as a user of
|
||||
such programs to change the free libraries that are incorporated in them.
|
||||
(We have not seen how to achieve this as regards changes in header files,
|
||||
but we have achieved it as regards changes in the actual functions of the
|
||||
Library.) The hope is that this will lead to faster development of free libraries.
|
||||
|
||||
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, while the latter only works together with the library.
|
||||
|
||||
Note that it is possible for a library to be covered by the ordinary General
|
||||
Public License rather than by this special one.
|
||||
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library which contains a
|
||||
notice placed by the copyright holder or other authorized party saying it
|
||||
may be distributed under the terms of this Library 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 compile 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) Accompany the work with a written offer, valid for at least three years,
|
||||
to give the same user the materials specified in Subsection 6a, above, for
|
||||
a charge no more than the cost of performing this distribution.
|
||||
|
||||
c) 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.
|
||||
|
||||
d) 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 source code 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 to 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 Library 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
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest possible
|
||||
use to the public, we recommend making it free software that everyone can
|
||||
redistribute and change. You can do so by permitting redistribution under
|
||||
these terms (or, alternatively, under the terms of the ordinary General Public
|
||||
License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is safest
|
||||
to attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
one line to give the library's name and an idea of what it does.
|
||||
|
||||
Copyright (C) year name of author
|
||||
|
||||
This library is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU Library General Public License as published by the Free
|
||||
Software Foundation; either version 2 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 Library General Public License for more
|
||||
details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public License
|
||||
along with this library; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the library, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
|
||||
by James Random Hacker.
|
||||
|
||||
signature of Ty Coon, 1 April 1990
|
||||
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,467 @@
|
|||
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.
|
||||
|
||||
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
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest possible
|
||||
use to the public, we recommend making it free software that everyone can
|
||||
redistribute and change. You can do so by permitting redistribution under
|
||||
these terms (or, alternatively, under the terms of the ordinary General Public
|
||||
License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is safest
|
||||
to attach them to the start of each source file to most effectively convey
|
||||
the exclusion of warranty; and each file should have at least the "copyright"
|
||||
line and a pointer to where the full notice is found.
|
||||
|
||||
< one line to give the library's name and an idea of what it does. >
|
||||
|
||||
Copyright (C) < year > < name of author >
|
||||
|
||||
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 Also add information
|
||||
on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your school,
|
||||
if any, to sign a "copyright disclaimer" for the library, if necessary. Here
|
||||
is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in
|
||||
|
||||
the library `Frob' (a library for tweaking knobs) written
|
||||
|
||||
by James Random Hacker.
|
||||
|
||||
< signature of Ty Coon > , 1 April 1990
|
||||
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
|
@ -0,0 +1,163 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
|
||||
Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
document, but changing it is not allowed.
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates the terms
|
||||
and conditions of version 3 of the GNU General Public License, supplemented
|
||||
by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser General
|
||||
Public License, and the "GNU GPL" refers to version 3 of the GNU General Public
|
||||
License.
|
||||
|
||||
|
||||
|
||||
"The Library" refers to a covered work governed by this License, other than
|
||||
an Application or a Combined Work as defined below.
|
||||
|
||||
|
||||
|
||||
An "Application" is any work that makes use of an interface provided by the
|
||||
Library, but which is not otherwise based on the Library. Defining a subclass
|
||||
of a class defined by the Library is deemed a mode of using an interface provided
|
||||
by the Library.
|
||||
|
||||
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an Application
|
||||
with the Library. The particular version of the Library with which the Combined
|
||||
Work was made is also called the "Linked Version".
|
||||
|
||||
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the Corresponding
|
||||
Source for the Combined Work, excluding any source code for portions of the
|
||||
Combined Work that, considered in isolation, are based on the Application,
|
||||
and not on the Linked Version.
|
||||
|
||||
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the object
|
||||
code and/or source code for the Application, including any data and utility
|
||||
programs needed for reproducing the Combined Work from the Application, but
|
||||
excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License without
|
||||
being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a facility
|
||||
refers to a function or data to be supplied by an Application that uses the
|
||||
facility (other than as an argument passed when the facility is invoked),
|
||||
then you may convey a copy of the modified version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to ensure
|
||||
that, in the event an Application does not supply the function or data, the
|
||||
facility still operates, and performs whatever part of its purpose remains
|
||||
meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of this License
|
||||
applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from a header
|
||||
file that is part of the Library. You may convey such object code under terms
|
||||
of your choice, provided that, if the incorporated material is not limited
|
||||
to numerical parameters, data structure layouts and accessors, or small macros,
|
||||
inline functions and templates (ten or fewer lines in length), you do both
|
||||
of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that, taken together,
|
||||
effectively do not restrict modification of the portions of the Library contained
|
||||
in the Combined Work and reverse engineering for debugging such modifications,
|
||||
if you also do each of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that the Library
|
||||
is used in it and that the Library and its use are covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during execution, include
|
||||
the copyright notice for the Library among these notices, as well as a reference
|
||||
directing the user to the copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this License,
|
||||
and the Corresponding Application Code in a form suitable for, and under terms
|
||||
that permit, the user to recombine or relink the Application with a modified
|
||||
version of the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the Library. A
|
||||
suitable mechanism is one that (a) uses at run time a copy of the Library
|
||||
already present on the user's computer system, and (b) will operate properly
|
||||
with a modified version of the Library that is interface-compatible with the
|
||||
Linked Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise be required
|
||||
to provide such information under section 6 of the GNU GPL, and only to the
|
||||
extent that such information is necessary to install and execute a modified
|
||||
version of the Combined Work produced by recombining or relinking the Application
|
||||
with a modified version of the Linked Version. (If you use option 4d0, the
|
||||
Installation Information must accompany the Minimal Corresponding Source and
|
||||
Corresponding Application Code. If you use option 4d1, you must provide the
|
||||
Installation Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
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 that are
|
||||
not Applications and are not covered by this License, and convey such a combined
|
||||
library under terms of your choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based on the
|
||||
Library, uncombined with any other library facilities, conveyed under the
|
||||
terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it is a work
|
||||
based on the Library, and explaining where to find the accompanying uncombined
|
||||
form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of the
|
||||
GNU 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 as you
|
||||
received it specifies that a certain numbered version of the GNU Lesser General
|
||||
Public License "or any later version" applies to it, you have the option of
|
||||
following the terms and conditions either of that published version or of
|
||||
any later version published by the Free Software Foundation. If the Library
|
||||
as you received it does not specify a version number of the GNU Lesser General
|
||||
Public License, you may choose any version of the GNU Lesser General Public
|
||||
License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide whether
|
||||
future versions of the GNU Lesser General Public License shall apply, that
|
||||
proxy's public statement of acceptance of any version is permanent authorization
|
||||
for you to choose that version for the Library.
|
|
@ -0,0 +1,12 @@
|
|||
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 3 of the license or (at your option) any later version
|
||||
that is accepted by the membership of KDE e.V. (or its successor
|
||||
approved by the membership of KDE e.V.), which shall act as a
|
||||
proxy as defined in Section 6 of version 3 of the license.
|
||||
|
||||
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.
|
|
@ -0,0 +1,4 @@
|
|||
include(ECMMarkAsTest)
|
||||
find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Test)
|
||||
|
||||
add_subdirectory(idletime)
|
|
@ -0,0 +1,4 @@
|
|||
add_executable(idleTest idle_test.cpp)
|
||||
target_link_libraries(idleTest Qt::Gui Qt::Test KF5::IdleTime KF5::WaylandClient)
|
||||
kwaylandtest(idleTest)
|
||||
ecm_mark_as_test(idleTest)
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2016 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
// Qt
|
||||
#include <QSignalSpy>
|
||||
#include <QtTest>
|
||||
// Frameworks
|
||||
#include <KIdleTime>
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/fakeinput.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
|
||||
using namespace KWayland::Client;
|
||||
|
||||
class IdleTest : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
private Q_SLOTS:
|
||||
void init();
|
||||
void cleanup();
|
||||
|
||||
void testCatchNextResumeEvent();
|
||||
void testTimeout();
|
||||
|
||||
private:
|
||||
ConnectionThread *m_connection = nullptr;
|
||||
FakeInput *m_fakeInput = nullptr;
|
||||
};
|
||||
|
||||
void IdleTest::init()
|
||||
{
|
||||
m_connection = ConnectionThread::fromApplication(this);
|
||||
QVERIFY(m_connection);
|
||||
Registry registry;
|
||||
registry.create(m_connection);
|
||||
QSignalSpy interfacesAnnounced(®istry, &Registry::interfacesAnnounced);
|
||||
QVERIFY(interfacesAnnounced.isValid());
|
||||
registry.setup();
|
||||
QVERIFY(interfacesAnnounced.wait());
|
||||
const auto fakeInterface = registry.interface(Registry::Interface::FakeInput);
|
||||
QVERIFY(fakeInterface.name != 0);
|
||||
m_fakeInput = registry.createFakeInput(fakeInterface.name, fakeInterface.version, this);
|
||||
}
|
||||
|
||||
void IdleTest::cleanup()
|
||||
{
|
||||
delete m_fakeInput;
|
||||
m_fakeInput = nullptr;
|
||||
delete m_connection;
|
||||
m_connection = nullptr;
|
||||
}
|
||||
|
||||
void IdleTest::testCatchNextResumeEvent()
|
||||
{
|
||||
// this test uses catch next resume event to get the resuming from idle signal
|
||||
QSignalSpy spy(KIdleTime::instance(), &KIdleTime::resumingFromIdle);
|
||||
QVERIFY(spy.isValid());
|
||||
KIdleTime::instance()->catchNextResumeEvent();
|
||||
// on Wayland there is a five sec minimum time
|
||||
QTest::qWait(6000);
|
||||
// now fake input
|
||||
QCOMPARE(spy.count(), 0);
|
||||
m_fakeInput->requestPointerMove(QSizeF(1, 2));
|
||||
QVERIFY(spy.wait());
|
||||
}
|
||||
|
||||
void IdleTest::testTimeout()
|
||||
{
|
||||
// this test verifies adding a timeout and firing it
|
||||
QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
|
||||
QSignalSpy timeout1Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int)));
|
||||
QVERIFY(timeout1Spy.isValid());
|
||||
QSignalSpy timeout2Spy(KIdleTime::instance(), SIGNAL(timeoutReached(int, int)));
|
||||
QVERIFY(timeout2Spy.isValid());
|
||||
|
||||
const auto id = KIdleTime::instance()->addIdleTimeout(6000);
|
||||
QCOMPARE(KIdleTime::instance()->idleTimeouts().size(), 1);
|
||||
QVERIFY(KIdleTime::instance()->idleTimeouts().contains(id));
|
||||
QCOMPARE(KIdleTime::instance()->idleTimeouts().value(id), 6000);
|
||||
// Wait some time
|
||||
QTest::qWait(4000);
|
||||
// now we should be able to wait for the timeout
|
||||
QVERIFY(timeout1Spy.wait());
|
||||
QCOMPARE(timeout1Spy.count(), 1);
|
||||
QCOMPARE(timeout2Spy.count(), 1);
|
||||
QCOMPARE(timeout1Spy.first().at(0).toInt(), id);
|
||||
QCOMPARE(timeout2Spy.first().at(0).toInt(), id);
|
||||
QCOMPARE(timeout2Spy.first().at(1).toInt(), 6000);
|
||||
|
||||
// let's fake some input
|
||||
// first wait
|
||||
QTest::qWait(4000);
|
||||
m_fakeInput->requestPointerMove(QSizeF(1, 2));
|
||||
QVERIFY(!timeout1Spy.wait());
|
||||
|
||||
// now let's remove the timeout
|
||||
KIdleTime::instance()->removeIdleTimeout(id);
|
||||
QVERIFY(KIdleTime::instance()->idleTimeouts().isEmpty());
|
||||
// now waiting should not trigger the timeout
|
||||
QTest::qWait(4000);
|
||||
QVERIFY(!timeout1Spy.wait());
|
||||
}
|
||||
|
||||
QTEST_MAIN(IdleTest)
|
||||
#include "idle_test.moc"
|
|
@ -0,0 +1,3 @@
|
|||
add_subdirectory(idletime)
|
||||
add_subdirectory(windowsystem)
|
||||
add_subdirectory(kmodifierkeyinfoprovider)
|
|
@ -0,0 +1,17 @@
|
|||
set(idletime_plugin_SRCS
|
||||
poller.cpp
|
||||
poller.h
|
||||
)
|
||||
|
||||
add_library(KF5IdleTimeKWaylandPlugin MODULE ${idletime_plugin_SRCS})
|
||||
target_link_libraries(KF5IdleTimeKWaylandPlugin
|
||||
KF5::IdleTime
|
||||
KF5::WaylandClient
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS
|
||||
KF5IdleTimeKWaylandPlugin
|
||||
DESTINATION
|
||||
${KDE_INSTALL_PLUGINDIR}/kf5/org.kde.kidletime.platforms/
|
||||
)
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"platforms": ["wayland", "wayland-egl"]
|
||||
}
|
|
@ -0,0 +1,200 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#include "poller.h"
|
||||
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/idle.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
#include <KWayland/Client/seat.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QGuiApplication>
|
||||
#include <QLoggingCategory>
|
||||
#include <QMutex>
|
||||
#include <QMutexLocker>
|
||||
#include <QWaitCondition>
|
||||
|
||||
Q_DECLARE_LOGGING_CATEGORY(POLLER)
|
||||
Q_LOGGING_CATEGORY(POLLER, "kf5idletime_kwayland")
|
||||
|
||||
Poller::Poller(QObject *parent)
|
||||
: AbstractSystemPoller(parent)
|
||||
, m_registryMutex(new QMutex())
|
||||
, m_registryAnnouncedCondition(new QWaitCondition())
|
||||
{
|
||||
if (!initWayland()) {
|
||||
m_inited = true;
|
||||
}
|
||||
}
|
||||
|
||||
Poller::~Poller() = default;
|
||||
|
||||
bool Poller::initWayland()
|
||||
{
|
||||
using namespace KWayland::Client;
|
||||
m_connectionThread = ConnectionThread::fromApplication(this);
|
||||
if (!m_connectionThread) {
|
||||
return false;
|
||||
}
|
||||
// need to be able to cleanup prior to the Wayland connection being destroyed
|
||||
// otherwise we get a crash in libwayland
|
||||
connect(reinterpret_cast<QObject *>(qApp->platformNativeInterface()), &QObject::destroyed, this, &Poller::unloadPoller);
|
||||
m_registry = new Registry(this);
|
||||
m_registry->create(m_connectionThread);
|
||||
connect(
|
||||
m_registry,
|
||||
&Registry::seatAnnounced,
|
||||
this,
|
||||
[this](quint32 name, quint32 version) {
|
||||
QMutexLocker locker(m_registryMutex.data());
|
||||
if (m_seat.name != 0) {
|
||||
// already have a seat
|
||||
return;
|
||||
}
|
||||
m_seat.name = name;
|
||||
m_seat.version = version;
|
||||
},
|
||||
Qt::DirectConnection);
|
||||
connect(
|
||||
m_registry,
|
||||
&Registry::idleAnnounced,
|
||||
this,
|
||||
[this](quint32 name, quint32 version) {
|
||||
QMutexLocker locker(m_registryMutex.data());
|
||||
if (m_idle.name != 0) {
|
||||
// already have a seat
|
||||
return;
|
||||
}
|
||||
m_idle.name = name;
|
||||
m_idle.version = version;
|
||||
},
|
||||
Qt::DirectConnection);
|
||||
connect(
|
||||
m_registry,
|
||||
&Registry::interfacesAnnounced,
|
||||
this,
|
||||
[this] {
|
||||
m_registryMutex->lock();
|
||||
m_inited = true;
|
||||
m_registryMutex->unlock();
|
||||
m_registryAnnouncedCondition->wakeAll();
|
||||
},
|
||||
Qt::DirectConnection);
|
||||
|
||||
m_registry->setup();
|
||||
m_connectionThread->roundtrip();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Poller::isAvailable()
|
||||
{
|
||||
m_registryMutex->lock();
|
||||
while (!m_inited) {
|
||||
m_registryAnnouncedCondition->wait(m_registryMutex.data());
|
||||
}
|
||||
m_registryMutex->unlock();
|
||||
return m_idle.name != 0;
|
||||
}
|
||||
|
||||
bool Poller::setUpPoller()
|
||||
{
|
||||
if (!m_registry || !isAvailable()) {
|
||||
return false;
|
||||
}
|
||||
if (!m_seat.seat) {
|
||||
m_seat.seat = m_registry->createSeat(m_seat.name, m_seat.version, this);
|
||||
}
|
||||
if (!m_idle.idle) {
|
||||
m_idle.idle = m_registry->createIdle(m_idle.name, m_idle.version, this);
|
||||
}
|
||||
return m_seat.seat->isValid() && m_idle.idle->isValid();
|
||||
}
|
||||
|
||||
void Poller::unloadPoller()
|
||||
{
|
||||
qDeleteAll(m_timeouts);
|
||||
m_timeouts.clear();
|
||||
|
||||
delete m_catchResumeTimeout;
|
||||
m_catchResumeTimeout = nullptr;
|
||||
|
||||
delete m_registry;
|
||||
m_registry = nullptr;
|
||||
|
||||
delete m_seat.seat;
|
||||
m_seat.seat = nullptr;
|
||||
delete m_idle.idle;
|
||||
m_idle.idle = nullptr;
|
||||
|
||||
delete m_connectionThread;
|
||||
m_connectionThread = nullptr;
|
||||
}
|
||||
|
||||
void Poller::addTimeout(int nextTimeout)
|
||||
{
|
||||
if (m_timeouts.contains(nextTimeout)) {
|
||||
return;
|
||||
}
|
||||
if (!m_idle.idle) {
|
||||
return;
|
||||
}
|
||||
auto timeout = m_idle.idle->getTimeout(nextTimeout, m_seat.seat, this);
|
||||
m_timeouts.insert(nextTimeout, timeout);
|
||||
connect(timeout, &KWayland::Client::IdleTimeout::idle, this, [this, nextTimeout] {
|
||||
Q_EMIT timeoutReached(nextTimeout);
|
||||
});
|
||||
connect(timeout, &KWayland::Client::IdleTimeout::resumeFromIdle, this, &Poller::resumingFromIdle);
|
||||
}
|
||||
|
||||
void Poller::removeTimeout(int nextTimeout)
|
||||
{
|
||||
auto it = m_timeouts.find(nextTimeout);
|
||||
if (it == m_timeouts.end()) {
|
||||
return;
|
||||
}
|
||||
delete it.value();
|
||||
m_timeouts.erase(it);
|
||||
}
|
||||
|
||||
QList<int> Poller::timeouts() const
|
||||
{
|
||||
return QList<int>();
|
||||
}
|
||||
|
||||
void Poller::catchIdleEvent()
|
||||
{
|
||||
if (m_catchResumeTimeout) {
|
||||
// already setup
|
||||
return;
|
||||
}
|
||||
if (!m_idle.idle) {
|
||||
return;
|
||||
}
|
||||
m_catchResumeTimeout = m_idle.idle->getTimeout(0, m_seat.seat, this);
|
||||
connect(m_catchResumeTimeout, &KWayland::Client::IdleTimeout::resumeFromIdle, this, [this] {
|
||||
stopCatchingIdleEvents();
|
||||
Q_EMIT resumingFromIdle();
|
||||
});
|
||||
}
|
||||
|
||||
void Poller::stopCatchingIdleEvents()
|
||||
{
|
||||
delete m_catchResumeTimeout;
|
||||
m_catchResumeTimeout = nullptr;
|
||||
}
|
||||
|
||||
int Poller::forcePollRequest()
|
||||
{
|
||||
qCWarning(POLLER) << "This plugin does not support polling idle time";
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Poller::simulateUserActivity()
|
||||
{
|
||||
for (auto it = m_timeouts.constBegin(); it != m_timeouts.constEnd(); ++it) {
|
||||
it.value()->simulateUserActivity();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef POLLER_H
|
||||
#define POLLER_H
|
||||
|
||||
#include <KIdleTime/private/abstractsystempoller.h>
|
||||
|
||||
#include <QHash>
|
||||
|
||||
class QMutex;
|
||||
class QWaitCondition;
|
||||
|
||||
namespace KWayland
|
||||
{
|
||||
namespace Client
|
||||
{
|
||||
class Seat;
|
||||
class Idle;
|
||||
class ConnectionThread;
|
||||
class IdleTimeout;
|
||||
class Registry;
|
||||
}
|
||||
}
|
||||
|
||||
class Poller : public AbstractSystemPoller
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.kde.kidletime.AbstractSystemPoller" FILE "kwayland.json")
|
||||
Q_INTERFACES(AbstractSystemPoller)
|
||||
|
||||
public:
|
||||
explicit Poller(QObject *parent = nullptr);
|
||||
~Poller() override;
|
||||
|
||||
bool isAvailable() override;
|
||||
bool setUpPoller() override;
|
||||
void unloadPoller() override;
|
||||
|
||||
public Q_SLOTS:
|
||||
void addTimeout(int nextTimeout) override;
|
||||
void removeTimeout(int nextTimeout) override;
|
||||
QList<int> timeouts() const override;
|
||||
int forcePollRequest() override;
|
||||
void catchIdleEvent() override;
|
||||
void stopCatchingIdleEvents() override;
|
||||
void simulateUserActivity() override;
|
||||
|
||||
private:
|
||||
bool initWayland();
|
||||
struct Seat {
|
||||
quint32 version = 0;
|
||||
quint32 name = 0;
|
||||
KWayland::Client::Seat *seat = nullptr;
|
||||
} m_seat;
|
||||
struct Idle {
|
||||
quint32 version = 0;
|
||||
quint32 name = 0;
|
||||
KWayland::Client::Idle *idle = nullptr;
|
||||
} m_idle;
|
||||
bool m_inited = false;
|
||||
QScopedPointer<QMutex> m_registryMutex;
|
||||
QScopedPointer<QWaitCondition> m_registryAnnouncedCondition;
|
||||
KWayland::Client::ConnectionThread *m_connectionThread = nullptr;
|
||||
KWayland::Client::Registry *m_registry = nullptr;
|
||||
KWayland::Client::IdleTimeout *m_catchResumeTimeout = nullptr;
|
||||
QHash<int, KWayland::Client::IdleTimeout *> m_timeouts;
|
||||
};
|
||||
|
||||
#endif /* XSYNCBASEDPOLLER_H */
|
|
@ -0,0 +1,3 @@
|
|||
add_library(kmodifierkey_wayland MODULE kmodifierkeyinfoprovider_wayland.cpp kmodifierkeyinfoprovider_wayland.h)
|
||||
target_link_libraries(kmodifierkey_wayland PRIVATE KF5::WaylandClient KF5::GuiAddons)
|
||||
install(TARGETS kmodifierkey_wayland DESTINATION ${KDE_INSTALL_PLUGINDIR}/kf5/kguiaddons/kmodifierkey/)
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "kmodifierkeyinfoprovider_wayland.h"
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
using namespace KWayland::Client;
|
||||
|
||||
KModifierKeyInfoProviderWayland::KModifierKeyInfoProviderWayland()
|
||||
{
|
||||
auto registry = new Registry(this);
|
||||
|
||||
auto m_waylandConnection = ConnectionThread::fromApplication(this);
|
||||
if (!m_waylandConnection) {
|
||||
qWarning() << "Failed getting Wayland connection from QPA";
|
||||
return;
|
||||
}
|
||||
registry->create(m_waylandConnection);
|
||||
registry->setup();
|
||||
|
||||
connect(registry, &Registry::keystateAnnounced, this, [this, registry](quint32 name, quint32 version) {
|
||||
m_keystate = registry->createKeystate(name, version, this);
|
||||
connect(m_keystate, &Keystate::stateChanged, this, &KModifierKeyInfoProviderWayland::updateModifiers);
|
||||
m_keystate->fetchStates();
|
||||
});
|
||||
|
||||
stateUpdated(Qt::Key_CapsLock, KModifierKeyInfoProvider::Nothing);
|
||||
stateUpdated(Qt::Key_NumLock, KModifierKeyInfoProvider::Nothing);
|
||||
stateUpdated(Qt::Key_ScrollLock, KModifierKeyInfoProvider::Nothing);
|
||||
}
|
||||
|
||||
KModifierKeyInfoProviderWayland::~KModifierKeyInfoProviderWayland() = default;
|
||||
|
||||
bool KModifierKeyInfoProviderWayland::setKeyLatched(Qt::Key /*key*/, bool /*latched*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool KModifierKeyInfoProviderWayland::setKeyLocked(Qt::Key /*key*/, bool /*locked*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
KModifierKeyInfoProvider::ModifierState toState(Keystate::State state)
|
||||
{
|
||||
switch (state) {
|
||||
case Keystate::State::Unlocked:
|
||||
return KModifierKeyInfoProvider::Nothing;
|
||||
case Keystate::State::Latched:
|
||||
return KModifierKeyInfoProvider::Latched;
|
||||
case Keystate::State::Locked:
|
||||
return KModifierKeyInfoProvider::Locked;
|
||||
}
|
||||
Q_UNREACHABLE();
|
||||
return KModifierKeyInfoProvider::Nothing;
|
||||
}
|
||||
|
||||
Qt::Key toKey(Keystate::Key key)
|
||||
{
|
||||
switch (key) {
|
||||
case Keystate::Key::CapsLock:
|
||||
return Qt::Key_CapsLock;
|
||||
case Keystate::Key::NumLock:
|
||||
return Qt::Key_NumLock;
|
||||
case Keystate::Key::ScrollLock:
|
||||
return Qt::Key_ScrollLock;
|
||||
}
|
||||
Q_UNREACHABLE();
|
||||
return {};
|
||||
}
|
||||
|
||||
void KModifierKeyInfoProviderWayland::updateModifiers(Keystate::Key key, Keystate::State state)
|
||||
{
|
||||
stateUpdated(toKey(key), toState(state));
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2019 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#ifndef KMODIFIERKEYINFOPROVIDERWAYLAND_H
|
||||
#define KMODIFIERKEYINFOPROVIDERWAYLAND_H
|
||||
|
||||
#include <KWayland/Client/keystate.h>
|
||||
#include <QPointer>
|
||||
#include <kmodifierkeyinfoprovider_p.h>
|
||||
|
||||
class KModifierKeyInfoProviderWayland : public KModifierKeyInfoProvider
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.kde.kguiaddons.KModifierKeyInfoProvider.Wayland")
|
||||
public:
|
||||
KModifierKeyInfoProviderWayland();
|
||||
~KModifierKeyInfoProviderWayland();
|
||||
|
||||
bool setKeyLatched(Qt::Key key, bool latched) override;
|
||||
bool setKeyLocked(Qt::Key key, bool locked) override;
|
||||
|
||||
private:
|
||||
void updateModifiers(KWayland::Client::Keystate::Key key, KWayland::Client::Keystate::State state);
|
||||
|
||||
QPointer<KWayland::Client::Keystate> m_keystate;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,52 @@
|
|||
set(wayland_plugin_SRCS
|
||||
plugin.cpp
|
||||
waylandintegration.cpp
|
||||
windoweffects.cpp
|
||||
windowinfo.cpp
|
||||
windowshadow.cpp
|
||||
windowsystem.cpp
|
||||
waylandxdgactivationv1.cpp
|
||||
plugin.h
|
||||
waylandintegration.h
|
||||
windoweffects.h
|
||||
windowinfo.h
|
||||
windowshadow.h
|
||||
windowsystem.h
|
||||
waylandxdgactivationv1_p.h
|
||||
)
|
||||
|
||||
ecm_add_qtwayland_client_protocol(wayland_plugin_SRCS
|
||||
PROTOCOL ${WaylandProtocols_DATADIR}/staging/xdg-activation/xdg-activation-v1.xml
|
||||
BASENAME xdg-activation-v1
|
||||
)
|
||||
ecm_qt_declare_logging_category(wayland_plugin_SRCS HEADER logging.h IDENTIFIER KWAYLAND_KWS
|
||||
CATEGORY_NAME org.kde.kf5.kwindowsystem.kwayland DEFAULT_SEVERITY Warning
|
||||
DESCRIPTION "wayland integration (windowsystem)" EXPORT KWAYLAND)
|
||||
|
||||
pkg_check_modules(XKBCommon REQUIRED IMPORTED_TARGET xkbcommon)
|
||||
|
||||
add_library(KF5WindowSystemKWaylandPlugin MODULE ${wayland_plugin_SRCS})
|
||||
target_link_libraries(KF5WindowSystemKWaylandPlugin
|
||||
KF5::WindowSystem
|
||||
KF5::WaylandClient
|
||||
Qt::Widgets
|
||||
Wayland::Client
|
||||
Qt::WaylandClient
|
||||
Qt::WaylandClientPrivate
|
||||
Qt::XkbCommonSupportPrivate
|
||||
PkgConfig::XKBCommon
|
||||
)
|
||||
|
||||
install(
|
||||
TARGETS
|
||||
KF5WindowSystemKWaylandPlugin
|
||||
DESTINATION
|
||||
${KDE_INSTALL_PLUGINDIR}/kf5/kwindowsystem/
|
||||
)
|
||||
|
||||
ecm_qt_install_logging_categories(
|
||||
EXPORT KWAYLAND
|
||||
FILE kwindowsystem.kwayland.categories
|
||||
DESTINATION ${KDE_INSTALL_LOGGINGCATEGORIESDIR}
|
||||
)
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#include "plugin.h"
|
||||
#include "windoweffects.h"
|
||||
#include "windowinfo.h"
|
||||
#include "windowshadow.h"
|
||||
#include "windowsystem.h"
|
||||
|
||||
KWaylandPlugin::KWaylandPlugin(QObject *parent)
|
||||
: KWindowSystemPluginInterface(parent)
|
||||
{
|
||||
}
|
||||
|
||||
KWaylandPlugin::~KWaylandPlugin()
|
||||
{
|
||||
}
|
||||
|
||||
KWindowEffectsPrivate *KWaylandPlugin::createEffects()
|
||||
{
|
||||
return new WindowEffects();
|
||||
}
|
||||
|
||||
KWindowSystemPrivate *KWaylandPlugin::createWindowSystem()
|
||||
{
|
||||
return new WindowSystem();
|
||||
}
|
||||
|
||||
KWindowInfoPrivate *KWaylandPlugin::createWindowInfo(WId window, NET::Properties properties, NET::Properties2 properties2)
|
||||
{
|
||||
return new WindowInfo(window, properties, properties2);
|
||||
}
|
||||
|
||||
KWindowShadowTilePrivate *KWaylandPlugin::createWindowShadowTile()
|
||||
{
|
||||
return new WindowShadowTile();
|
||||
}
|
||||
|
||||
KWindowShadowPrivate *KWaylandPlugin::createWindowShadow()
|
||||
{
|
||||
return new WindowShadow();
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef KWINDOWSYSTEM_KWAYLAND_PLUGIN_H
|
||||
#define KWINDOWSYSTEM_KWAYLAND_PLUGIN_H
|
||||
|
||||
#include <KWindowSystem/private/kwindowsystemplugininterface_p.h>
|
||||
|
||||
class KWaylandPlugin : public KWindowSystemPluginInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PLUGIN_METADATA(IID "org.kde.kwindowsystem.KWindowSystemPluginInterface" FILE "wayland.json")
|
||||
Q_INTERFACES(KWindowSystemPluginInterface)
|
||||
|
||||
public:
|
||||
explicit KWaylandPlugin(QObject *parent = nullptr);
|
||||
~KWaylandPlugin() override;
|
||||
|
||||
KWindowEffectsPrivate *createEffects() override;
|
||||
KWindowSystemPrivate *createWindowSystem() override;
|
||||
KWindowInfoPrivate *createWindowInfo(WId window, NET::Properties properties, NET::Properties2 properties2) override;
|
||||
KWindowShadowTilePrivate *createWindowShadowTile() override;
|
||||
KWindowShadowPrivate *createWindowShadow() override;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,3 @@
|
|||
{
|
||||
"platforms": ["wayland", "wayland-egl"]
|
||||
}
|
|
@ -0,0 +1,225 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "waylandintegration.h"
|
||||
#include "logging.h"
|
||||
|
||||
#include <KWayland/Client/blur.h>
|
||||
#include <KWayland/Client/compositor.h>
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/contrast.h>
|
||||
#include <KWayland/Client/plasmashell.h>
|
||||
#include <KWayland/Client/plasmawindowmanagement.h>
|
||||
#include <KWayland/Client/region.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
#include <KWayland/Client/shadow.h>
|
||||
#include <KWayland/Client/shm_pool.h>
|
||||
#include <KWayland/Client/slide.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
|
||||
#include <KWindowSystem/KWindowSystem>
|
||||
|
||||
#include "waylandxdgactivationv1_p.h"
|
||||
#include <QGuiApplication>
|
||||
|
||||
class WaylandIntegrationSingleton
|
||||
{
|
||||
public:
|
||||
WaylandIntegration self;
|
||||
};
|
||||
|
||||
Q_GLOBAL_STATIC(WaylandIntegrationSingleton, privateWaylandIntegrationSelf)
|
||||
|
||||
WaylandIntegration::WaylandIntegration()
|
||||
: QObject()
|
||||
{
|
||||
setupKWaylandIntegration();
|
||||
}
|
||||
|
||||
WaylandIntegration::~WaylandIntegration()
|
||||
{
|
||||
}
|
||||
|
||||
void WaylandIntegration::setupKWaylandIntegration()
|
||||
{
|
||||
using namespace KWayland::Client;
|
||||
m_waylandConnection = ConnectionThread::fromApplication(this);
|
||||
if (!m_waylandConnection) {
|
||||
qCWarning(KWAYLAND_KWS) << "Failed getting Wayland connection from QPA";
|
||||
return;
|
||||
}
|
||||
m_registry = new Registry(qApp);
|
||||
connect(m_registry, &KWayland::Client::Registry::interfaceAnnounced, this, [this](const QByteArray &interfaceName, quint32 name, quint32 version) {
|
||||
if (interfaceName != xdg_activation_v1_interface.name)
|
||||
return;
|
||||
|
||||
m_activationInterface = {name, version};
|
||||
});
|
||||
m_registry->create(m_waylandConnection);
|
||||
m_waylandCompositor = Compositor::fromApplication(this);
|
||||
|
||||
m_registry->setup();
|
||||
m_waylandConnection->roundtrip();
|
||||
}
|
||||
|
||||
WaylandIntegration *WaylandIntegration::self()
|
||||
{
|
||||
return &privateWaylandIntegrationSelf()->self;
|
||||
}
|
||||
|
||||
KWayland::Client::Registry *WaylandIntegration::registry() const
|
||||
{
|
||||
return m_registry;
|
||||
}
|
||||
|
||||
KWayland::Client::ConnectionThread *WaylandIntegration::waylandConnection() const
|
||||
{
|
||||
return m_waylandConnection;
|
||||
}
|
||||
|
||||
KWayland::Client::BlurManager *WaylandIntegration::waylandBlurManager()
|
||||
{
|
||||
if (!m_waylandBlurManager && m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::Blur);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_waylandBlurManager = m_registry->createBlurManager(wmInterface.name, wmInterface.version, qApp);
|
||||
|
||||
connect(m_waylandBlurManager, &KWayland::Client::BlurManager::removed, this, [this]() {
|
||||
m_waylandBlurManager->deleteLater();
|
||||
});
|
||||
}
|
||||
|
||||
return m_waylandBlurManager;
|
||||
}
|
||||
|
||||
KWayland::Client::ContrastManager *WaylandIntegration::waylandContrastManager()
|
||||
{
|
||||
if (!m_waylandContrastManager && m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::Contrast);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_waylandContrastManager = m_registry->createContrastManager(wmInterface.name, wmInterface.version, qApp);
|
||||
|
||||
connect(m_waylandContrastManager, &KWayland::Client::ContrastManager::removed, this, [this]() {
|
||||
m_waylandContrastManager->deleteLater();
|
||||
});
|
||||
}
|
||||
return m_waylandContrastManager;
|
||||
}
|
||||
|
||||
KWayland::Client::SlideManager *WaylandIntegration::waylandSlideManager()
|
||||
{
|
||||
if (!m_waylandSlideManager && m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::Slide);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_waylandSlideManager = m_registry->createSlideManager(wmInterface.name, wmInterface.version, qApp);
|
||||
|
||||
connect(m_waylandSlideManager, &KWayland::Client::SlideManager::removed, this, [this]() {
|
||||
m_waylandSlideManager->deleteLater();
|
||||
});
|
||||
}
|
||||
|
||||
return m_waylandSlideManager;
|
||||
}
|
||||
|
||||
KWayland::Client::ShadowManager *WaylandIntegration::waylandShadowManager()
|
||||
{
|
||||
if (!m_waylandShadowManager && m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::Shadow);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
qCWarning(KWAYLAND_KWS) << "This compositor does not support the Shadow interface";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_waylandShadowManager = m_registry->createShadowManager(wmInterface.name, wmInterface.version, qApp);
|
||||
|
||||
connect(m_waylandShadowManager, &KWayland::Client::ShadowManager::removed, this, [this]() {
|
||||
m_waylandShadowManager->deleteLater();
|
||||
});
|
||||
}
|
||||
|
||||
return m_waylandShadowManager;
|
||||
}
|
||||
|
||||
KWayland::Client::Compositor *WaylandIntegration::waylandCompositor() const
|
||||
{
|
||||
return m_waylandCompositor;
|
||||
}
|
||||
|
||||
KWayland::Client::PlasmaWindowManagement *WaylandIntegration::plasmaWindowManagement()
|
||||
{
|
||||
using namespace KWayland::Client;
|
||||
|
||||
if (!m_wm && m_registry) {
|
||||
const Registry::AnnouncedInterface wmInterface = m_registry->interface(Registry::Interface::PlasmaWindowManagement);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
qCWarning(KWAYLAND_KWS) << "This compositor does not support the Plasma Window Management interface";
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_wm = m_registry->createPlasmaWindowManagement(wmInterface.name, wmInterface.version, qApp);
|
||||
connect(m_wm, &PlasmaWindowManagement::showingDesktopChanged, KWindowSystem::self(), &KWindowSystem::showingDesktopChanged);
|
||||
qCDebug(KWAYLAND_KWS) << "Plasma Window Management interface bound";
|
||||
|
||||
connect(m_wm, &KWayland::Client::PlasmaWindowManagement::removed, this, [this]() {
|
||||
m_wm->deleteLater();
|
||||
});
|
||||
}
|
||||
|
||||
return m_wm;
|
||||
}
|
||||
|
||||
KWayland::Client::PlasmaShell *WaylandIntegration::waylandPlasmaShell()
|
||||
{
|
||||
if (!m_waylandPlasmaShell && m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::PlasmaShell);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_waylandPlasmaShell = m_registry->createPlasmaShell(wmInterface.name, wmInterface.version, qApp);
|
||||
}
|
||||
return m_waylandPlasmaShell;
|
||||
}
|
||||
|
||||
KWayland::Client::ShmPool *WaylandIntegration::createShmPool()
|
||||
{
|
||||
if (m_registry) {
|
||||
const KWayland::Client::Registry::AnnouncedInterface wmInterface = m_registry->interface(KWayland::Client::Registry::Interface::Shm);
|
||||
|
||||
if (wmInterface.name == 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return m_registry->createShmPool(wmInterface.name, wmInterface.version);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
WaylandXdgActivationV1 *WaylandIntegration::activation()
|
||||
{
|
||||
if (!m_activation && m_registry && m_activationInterface.name) {
|
||||
m_activation = new WaylandXdgActivationV1(*m_registry, m_activationInterface.name, m_activationInterface.version);
|
||||
}
|
||||
return m_activation;
|
||||
}
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
|
||||
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef WAYLANDINTEGRATION_H
|
||||
#define WAYLANDINTEGRATION_H
|
||||
#include <KWindowSystem/private/kwindoweffects_p.h>
|
||||
|
||||
#include <QPointer>
|
||||
|
||||
namespace KWayland
|
||||
{
|
||||
namespace Client
|
||||
{
|
||||
class BlurManager;
|
||||
class ContrastManager;
|
||||
class Compositor;
|
||||
class ConnectionThread;
|
||||
class PlasmaWindowManagement;
|
||||
class PlasmaShell;
|
||||
class Registry;
|
||||
class ShadowManager;
|
||||
class ShmPool;
|
||||
class SlideManager;
|
||||
}
|
||||
}
|
||||
class WaylandXdgActivationV1;
|
||||
|
||||
class WaylandIntegration : public QObject
|
||||
{
|
||||
public:
|
||||
explicit WaylandIntegration();
|
||||
~WaylandIntegration();
|
||||
void setupKWaylandIntegration();
|
||||
|
||||
static WaylandIntegration *self();
|
||||
|
||||
KWayland::Client::Registry *registry() const;
|
||||
KWayland::Client::ConnectionThread *waylandConnection() const;
|
||||
KWayland::Client::BlurManager *waylandBlurManager();
|
||||
KWayland::Client::ContrastManager *waylandContrastManager();
|
||||
KWayland::Client::SlideManager *waylandSlideManager();
|
||||
KWayland::Client::ShadowManager *waylandShadowManager();
|
||||
KWayland::Client::Compositor *waylandCompositor() const;
|
||||
KWayland::Client::PlasmaWindowManagement *plasmaWindowManagement();
|
||||
KWayland::Client::PlasmaShell *waylandPlasmaShell();
|
||||
KWayland::Client::ShmPool *createShmPool();
|
||||
WaylandXdgActivationV1 *activation();
|
||||
|
||||
private:
|
||||
QPointer<KWayland::Client::ConnectionThread> m_waylandConnection;
|
||||
QPointer<KWayland::Client::Compositor> m_waylandCompositor;
|
||||
QPointer<KWayland::Client::Registry> m_registry;
|
||||
QPointer<KWayland::Client::BlurManager> m_waylandBlurManager;
|
||||
QPointer<KWayland::Client::ContrastManager> m_waylandContrastManager;
|
||||
QPointer<KWayland::Client::SlideManager> m_waylandSlideManager;
|
||||
QPointer<KWayland::Client::ShadowManager> m_waylandShadowManager;
|
||||
QPointer<KWayland::Client::PlasmaWindowManagement> m_wm;
|
||||
QPointer<KWayland::Client::PlasmaShell> m_waylandPlasmaShell;
|
||||
QPointer<WaylandXdgActivationV1> m_activation;
|
||||
struct {
|
||||
quint32 name = 0;
|
||||
quint32 version = 0;
|
||||
} m_activationInterface;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "waylandxdgactivationv1_p.h"
|
||||
|
||||
WaylandXdgActivationV1::WaylandXdgActivationV1(wl_registry *registry, uint32_t id, uint32_t availableVersion)
|
||||
: QtWayland::xdg_activation_v1(registry, id, qMin(availableVersion, 1u))
|
||||
{
|
||||
}
|
||||
|
||||
WaylandXdgActivationV1::~WaylandXdgActivationV1()
|
||||
{
|
||||
Q_ASSERT(isInitialized());
|
||||
destroy();
|
||||
}
|
||||
|
||||
WaylandXdgActivationTokenV1 *
|
||||
WaylandXdgActivationV1::requestXdgActivationToken(wl_seat *seat, struct ::wl_surface *surface, uint32_t serial, const QString &app_id)
|
||||
{
|
||||
auto wl = get_activation_token();
|
||||
auto provider = new WaylandXdgActivationTokenV1;
|
||||
provider->init(wl);
|
||||
|
||||
if (surface)
|
||||
provider->set_surface(surface);
|
||||
|
||||
if (!app_id.isEmpty())
|
||||
provider->set_app_id(app_id);
|
||||
|
||||
if (seat)
|
||||
provider->set_serial(serial, seat);
|
||||
provider->commit();
|
||||
return provider;
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2021 Aleix Pol Gonzalez <aleixpol@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef WAYLANDXDGACTIVATIONV1_P_H
|
||||
#define WAYLANDXDGACTIVATIONV1_P_H
|
||||
|
||||
#include "qwayland-xdg-activation-v1.h"
|
||||
#include <QObject>
|
||||
|
||||
class QWaylandSurface;
|
||||
|
||||
class WaylandXdgActivationTokenV1 : public QObject, public QtWayland::xdg_activation_token_v1
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
void xdg_activation_token_v1_done(const QString &token) override
|
||||
{
|
||||
Q_EMIT done(token);
|
||||
}
|
||||
|
||||
Q_SIGNALS:
|
||||
void failed();
|
||||
void done(const QString &token);
|
||||
};
|
||||
|
||||
class WaylandXdgActivationV1 : public QObject, public QtWayland::xdg_activation_v1
|
||||
{
|
||||
public:
|
||||
WaylandXdgActivationV1(struct ::wl_registry *registry, uint32_t id, uint32_t availableVersion);
|
||||
~WaylandXdgActivationV1() override;
|
||||
|
||||
WaylandXdgActivationTokenV1 *requestXdgActivationToken(wl_seat *seat, struct ::wl_surface *surface, uint32_t serial, const QString &app_id);
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,352 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "windoweffects.h"
|
||||
#include "waylandintegration.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QExposeEvent>
|
||||
#include <QGuiApplication>
|
||||
#include <QWidget>
|
||||
|
||||
#include <KWayland/Client/blur.h>
|
||||
#include <KWayland/Client/compositor.h>
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/contrast.h>
|
||||
#include <KWayland/Client/plasmashell.h>
|
||||
#include <KWayland/Client/plasmawindowmanagement.h>
|
||||
#include <KWayland/Client/region.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
#include <KWayland/Client/slide.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
|
||||
WindowEffects::WindowEffects()
|
||||
: QObject()
|
||||
, KWindowEffectsPrivateV2()
|
||||
{
|
||||
auto registry = WaylandIntegration::self()->registry();
|
||||
|
||||
// The KWindowEffects API doesn't provide any signals to notify that the particular
|
||||
// effect has become unavailable. So we re-install effects when the corresponding globals
|
||||
// are added.
|
||||
connect(registry, &KWayland::Client::Registry::blurAnnounced, this, [this]() {
|
||||
for (auto it = m_blurRegions.constBegin(); it != m_blurRegions.constEnd(); ++it) {
|
||||
installBlur(it.key(), true, *it);
|
||||
}
|
||||
});
|
||||
connect(registry, &KWayland::Client::Registry::blurRemoved, this, [this]() {
|
||||
for (auto it = m_blurRegions.constBegin(); it != m_blurRegions.constEnd(); ++it) {
|
||||
installBlur(it.key(), false, *it);
|
||||
}
|
||||
});
|
||||
|
||||
connect(registry, &KWayland::Client::Registry::contrastAnnounced, this, [this]() {
|
||||
for (auto it = m_backgroundConstrastRegions.constBegin(); it != m_backgroundConstrastRegions.constEnd(); ++it) {
|
||||
installContrast(it.key(), true, it->contrast, it->intensity, it->saturation, it->region);
|
||||
}
|
||||
});
|
||||
connect(registry, &KWayland::Client::Registry::contrastRemoved, this, [this]() {
|
||||
for (auto it = m_backgroundConstrastRegions.constBegin(); it != m_backgroundConstrastRegions.constEnd(); ++it) {
|
||||
installContrast(it.key(), false);
|
||||
}
|
||||
});
|
||||
|
||||
connect(registry, &KWayland::Client::Registry::slideAnnounced, this, [this]() {
|
||||
for (auto it = m_slideMap.constBegin(); it != m_slideMap.constEnd(); ++it) {
|
||||
installSlide(it.key(), it->location, it->offset);
|
||||
}
|
||||
});
|
||||
connect(registry, &KWayland::Client::Registry::slideRemoved, this, [this]() {
|
||||
for (auto it = m_slideMap.constBegin(); it != m_slideMap.constEnd(); ++it) {
|
||||
installSlide(it.key(), KWindowEffects::SlideFromLocation::NoEdge, 0);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
WindowEffects::~WindowEffects()
|
||||
{
|
||||
}
|
||||
|
||||
QWindow *WindowEffects::windowForId(WId wid)
|
||||
{
|
||||
QWindow *window = nullptr;
|
||||
|
||||
for (auto win : qApp->allWindows()) {
|
||||
if (win->winId() == wid) {
|
||||
window = win;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return window;
|
||||
}
|
||||
|
||||
void WindowEffects::trackWindow(QWindow *window)
|
||||
{
|
||||
if (!m_windowWatchers.contains(window)) {
|
||||
window->installEventFilter(this);
|
||||
auto conn = connect(window, &QObject::destroyed, this, [this, window]() {
|
||||
m_blurRegions.remove(window);
|
||||
m_backgroundConstrastRegions.remove(window);
|
||||
m_slideMap.remove(window);
|
||||
m_windowWatchers.remove(window);
|
||||
});
|
||||
m_windowWatchers[window] = conn;
|
||||
}
|
||||
}
|
||||
|
||||
void WindowEffects::releaseWindow(QWindow *window)
|
||||
{
|
||||
if (!m_blurRegions.contains(window) && !m_backgroundConstrastRegions.contains(window) && !m_slideMap.contains(window)) {
|
||||
disconnect(m_windowWatchers[window]);
|
||||
window->removeEventFilter(this);
|
||||
m_windowWatchers.remove(window);
|
||||
}
|
||||
}
|
||||
|
||||
bool WindowEffects::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
if (event->type() == QEvent::Expose) {
|
||||
auto ee = static_cast<QExposeEvent *>(event);
|
||||
|
||||
if ((ee->region().isNull())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto window = qobject_cast<QWindow *>(watched);
|
||||
if (!window) {
|
||||
return false;
|
||||
}
|
||||
|
||||
{
|
||||
auto it = m_blurRegions.constFind(window);
|
||||
if (it != m_blurRegions.constEnd()) {
|
||||
installBlur(window, true, *it);
|
||||
}
|
||||
}
|
||||
{
|
||||
auto it = m_backgroundConstrastRegions.constFind(window);
|
||||
if (it != m_backgroundConstrastRegions.constEnd()) {
|
||||
installContrast(window, true, it->contrast, it->intensity, it->saturation, it->region);
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WindowEffects::isEffectAvailable(KWindowEffects::Effect effect)
|
||||
{
|
||||
switch (effect) {
|
||||
case KWindowEffects::BackgroundContrast:
|
||||
return WaylandIntegration::self()->waylandContrastManager() != nullptr;
|
||||
case KWindowEffects::BlurBehind:
|
||||
return WaylandIntegration::self()->waylandBlurManager() != nullptr;
|
||||
case KWindowEffects::Slide:
|
||||
return WaylandIntegration::self()->waylandSlideManager() != nullptr;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
void WindowEffects::slideWindow(WId id, KWindowEffects::SlideFromLocation location, int offset)
|
||||
{
|
||||
auto window = windowForId(id);
|
||||
if (!window) {
|
||||
return;
|
||||
}
|
||||
if (location != KWindowEffects::SlideFromLocation::NoEdge) {
|
||||
m_slideMap[window] = SlideData{
|
||||
.location = location,
|
||||
.offset = offset,
|
||||
};
|
||||
trackWindow(window);
|
||||
} else {
|
||||
m_slideMap.remove(window);
|
||||
releaseWindow(window);
|
||||
}
|
||||
|
||||
installSlide(window, location, offset);
|
||||
}
|
||||
|
||||
void WindowEffects::installSlide(QWindow *window, KWindowEffects::SlideFromLocation location, int offset)
|
||||
{
|
||||
if (!WaylandIntegration::self()->waylandSlideManager()) {
|
||||
return;
|
||||
}
|
||||
KWayland::Client::Surface *surface = KWayland::Client::Surface::fromWindow(window);
|
||||
if (surface) {
|
||||
if (location != KWindowEffects::SlideFromLocation::NoEdge) {
|
||||
auto slide = WaylandIntegration::self()->waylandSlideManager()->createSlide(surface, surface);
|
||||
|
||||
KWayland::Client::Slide::Location convertedLoc;
|
||||
switch (location) {
|
||||
case KWindowEffects::SlideFromLocation::TopEdge:
|
||||
convertedLoc = KWayland::Client::Slide::Location::Top;
|
||||
break;
|
||||
case KWindowEffects::SlideFromLocation::LeftEdge:
|
||||
convertedLoc = KWayland::Client::Slide::Location::Left;
|
||||
break;
|
||||
case KWindowEffects::SlideFromLocation::RightEdge:
|
||||
convertedLoc = KWayland::Client::Slide::Location::Right;
|
||||
break;
|
||||
case KWindowEffects::SlideFromLocation::BottomEdge:
|
||||
default:
|
||||
convertedLoc = KWayland::Client::Slide::Location::Bottom;
|
||||
break;
|
||||
}
|
||||
|
||||
slide->setLocation(convertedLoc);
|
||||
slide->setOffset(offset);
|
||||
slide->commit();
|
||||
} else {
|
||||
WaylandIntegration::self()->waylandSlideManager()->removeSlide(surface);
|
||||
}
|
||||
|
||||
WaylandIntegration::self()->waylandConnection()->flush();
|
||||
}
|
||||
}
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 81)
|
||||
QList<QSize> WindowEffects::windowSizes(const QList<WId> &ids)
|
||||
{
|
||||
Q_UNUSED(ids)
|
||||
QList<QSize> sizes;
|
||||
return sizes;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 82)
|
||||
void WindowEffects::presentWindows(WId controller, const QList<WId> &ids)
|
||||
{
|
||||
Q_UNUSED(controller)
|
||||
Q_UNUSED(ids)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 82)
|
||||
void WindowEffects::presentWindows(WId controller, int desktop)
|
||||
{
|
||||
Q_UNUSED(controller)
|
||||
Q_UNUSED(desktop)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 82)
|
||||
void WindowEffects::highlightWindows(WId controller, const QList<WId> &ids)
|
||||
{
|
||||
Q_UNUSED(controller)
|
||||
Q_UNUSED(ids)
|
||||
}
|
||||
#endif
|
||||
|
||||
void WindowEffects::enableBlurBehind(WId winId, bool enable, const QRegion ®ion)
|
||||
{
|
||||
auto window = windowForId(winId);
|
||||
if (!window) {
|
||||
return;
|
||||
}
|
||||
if (enable) {
|
||||
trackWindow(window);
|
||||
m_blurRegions[window] = region;
|
||||
} else {
|
||||
m_blurRegions.remove(window);
|
||||
releaseWindow(window);
|
||||
}
|
||||
|
||||
installBlur(window, enable, region);
|
||||
}
|
||||
|
||||
void WindowEffects::installBlur(QWindow *window, bool enable, const QRegion ®ion)
|
||||
{
|
||||
if (!WaylandIntegration::self()->waylandBlurManager()) {
|
||||
return;
|
||||
}
|
||||
KWayland::Client::Surface *surface = KWayland::Client::Surface::fromWindow(window);
|
||||
|
||||
if (surface) {
|
||||
if (enable) {
|
||||
auto blur = WaylandIntegration::self()->waylandBlurManager()->createBlur(surface, surface);
|
||||
blur->setRegion(WaylandIntegration::self()->waylandCompositor()->createRegion(region, nullptr));
|
||||
blur->commit();
|
||||
} else {
|
||||
WaylandIntegration::self()->waylandBlurManager()->removeBlur(surface);
|
||||
}
|
||||
|
||||
WaylandIntegration::self()->waylandConnection()->flush();
|
||||
}
|
||||
}
|
||||
|
||||
void WindowEffects::enableBackgroundContrast(WId winId, bool enable, qreal contrast, qreal intensity, qreal saturation, const QRegion ®ion)
|
||||
{
|
||||
auto window = windowForId(winId);
|
||||
if (!window) {
|
||||
return;
|
||||
}
|
||||
if (enable) {
|
||||
trackWindow(window);
|
||||
m_backgroundConstrastRegions[window].contrast = contrast;
|
||||
m_backgroundConstrastRegions[window].intensity = intensity;
|
||||
m_backgroundConstrastRegions[window].saturation = saturation;
|
||||
m_backgroundConstrastRegions[window].region = region;
|
||||
} else {
|
||||
m_backgroundConstrastRegions.remove(window);
|
||||
releaseWindow(window);
|
||||
}
|
||||
|
||||
installContrast(window, enable, contrast, intensity, saturation, region);
|
||||
}
|
||||
|
||||
void WindowEffects::installContrast(QWindow *window, bool enable, qreal contrast, qreal intensity, qreal saturation, const QRegion ®ion)
|
||||
{
|
||||
if (!WaylandIntegration::self()->waylandContrastManager()) {
|
||||
return;
|
||||
}
|
||||
KWayland::Client::Surface *surface = KWayland::Client::Surface::fromWindow(window);
|
||||
if (surface) {
|
||||
if (enable) {
|
||||
auto backgroundContrast = WaylandIntegration::self()->waylandContrastManager()->createContrast(surface, surface);
|
||||
backgroundContrast->setRegion(WaylandIntegration::self()->waylandCompositor()->createRegion(region, nullptr));
|
||||
backgroundContrast->setContrast(contrast);
|
||||
backgroundContrast->setIntensity(intensity);
|
||||
backgroundContrast->setSaturation(saturation);
|
||||
backgroundContrast->commit();
|
||||
} else {
|
||||
WaylandIntegration::self()->waylandContrastManager()->removeContrast(surface);
|
||||
}
|
||||
|
||||
WaylandIntegration::self()->waylandConnection()->flush();
|
||||
}
|
||||
}
|
||||
|
||||
void WindowEffects::setBackgroundFrost(QWindow *window, QColor color, const QRegion ®ion)
|
||||
{
|
||||
if (!WaylandIntegration::self()->waylandContrastManager()) {
|
||||
return;
|
||||
}
|
||||
|
||||
KWayland::Client::Surface *surface = KWayland::Client::Surface::fromWindow(window);
|
||||
if (!surface) {
|
||||
return;
|
||||
}
|
||||
if (!color.isValid()) {
|
||||
WaylandIntegration::self()->waylandContrastManager()->removeContrast(surface);
|
||||
return;
|
||||
}
|
||||
|
||||
auto backgroundContrast = WaylandIntegration::self()->waylandContrastManager()->createContrast(surface, surface);
|
||||
backgroundContrast->setRegion(WaylandIntegration::self()->waylandCompositor()->createRegion(region, nullptr));
|
||||
backgroundContrast->setFrost(color);
|
||||
backgroundContrast->commit();
|
||||
|
||||
WaylandIntegration::self()->waylandConnection()->flush();
|
||||
}
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 67)
|
||||
void WindowEffects::markAsDashboard(WId window)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef WINDOWEFFECTS_H
|
||||
#define WINDOWEFFECTS_H
|
||||
#include <KWindowSystem/private/kwindoweffects_p.h>
|
||||
#include <kwindowsystem_version.h>
|
||||
|
||||
#include <QHash>
|
||||
|
||||
namespace KWayland
|
||||
{
|
||||
namespace Client
|
||||
{
|
||||
class BlurManager;
|
||||
class ContrastManager;
|
||||
class Compositor;
|
||||
class ConnectionThread;
|
||||
}
|
||||
}
|
||||
|
||||
class WindowEffects : public QObject, public KWindowEffectsPrivateV2
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
WindowEffects();
|
||||
~WindowEffects() override;
|
||||
|
||||
static QWindow *windowForId(WId);
|
||||
|
||||
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||
void trackWindow(QWindow *window);
|
||||
void releaseWindow(QWindow *window);
|
||||
|
||||
bool isEffectAvailable(KWindowEffects::Effect effect) override;
|
||||
void slideWindow(WId id, KWindowEffects::SlideFromLocation location, int offset) override;
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 81)
|
||||
QList<QSize> windowSizes(const QList<WId> &ids) override;
|
||||
#endif
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 82)
|
||||
void presentWindows(WId controller, const QList<WId> &ids) override;
|
||||
void presentWindows(WId controller, int desktop = NET::OnAllDesktops) override;
|
||||
void highlightWindows(WId controller, const QList<WId> &ids) override;
|
||||
#endif
|
||||
void enableBlurBehind(WId winId, bool enable = true, const QRegion ®ion = QRegion()) override;
|
||||
void enableBackgroundContrast(WId winId,
|
||||
bool enable = true,
|
||||
qreal contrast = 1,
|
||||
qreal intensity = 1,
|
||||
qreal saturation = 1,
|
||||
const QRegion ®ion = QRegion()) override;
|
||||
void setBackgroundFrost(QWindow *window, QColor color, const QRegion ®ion = QRegion()) override;
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 67)
|
||||
void markAsDashboard(WId window) override;
|
||||
#endif
|
||||
private:
|
||||
void installContrast(QWindow *window, bool enable = true, qreal contrast = 1, qreal intensity = 1, qreal saturation = 1, const QRegion ®ion = QRegion());
|
||||
void installBlur(QWindow *window, bool enable, const QRegion ®ion);
|
||||
void installSlide(QWindow *window, KWindowEffects::SlideFromLocation location, int offset);
|
||||
|
||||
QHash<QWindow *, QMetaObject::Connection> m_windowWatchers;
|
||||
QHash<QWindow *, QRegion> m_blurRegions;
|
||||
struct BackgroundContrastData {
|
||||
qreal contrast = 1;
|
||||
qreal intensity = 1;
|
||||
qreal saturation = 1;
|
||||
QRegion region;
|
||||
};
|
||||
QHash<QWindow *, BackgroundContrastData> m_backgroundConstrastRegions;
|
||||
struct SlideData {
|
||||
KWindowEffects::SlideFromLocation location;
|
||||
int offset;
|
||||
};
|
||||
QHash<QWindow *, SlideData> m_slideMap;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,209 @@
|
|||
/*
|
||||
This file is part of the KDE libraries
|
||||
SPDX-FileCopyrightText: 1999 Matthias Ettrich (ettrich@kde.org)
|
||||
SPDX-FileCopyrightText: 2007 Lubos Lunak (l.lunak@kde.org)
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include "windowinfo.h"
|
||||
#include "kwindowsystem.h"
|
||||
#include "waylandintegration.h"
|
||||
|
||||
#include <config-kwindowsystem.h>
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QRect>
|
||||
|
||||
#include <KWayland/Client/plasmashell.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
|
||||
WindowInfo::WindowInfo(WId window, NET::Properties properties, NET::Properties2 properties2)
|
||||
: KWindowInfoPrivate(window, properties, properties2)
|
||||
, m_valid(false)
|
||||
, m_properties(properties)
|
||||
, m_properties2(properties2)
|
||||
, m_surface(KWayland::Client::Surface::fromQtWinId(window))
|
||||
, m_plasmaShellSurface(KWayland::Client::PlasmaShellSurface::get(m_surface))
|
||||
{
|
||||
m_valid = m_surface != nullptr && m_surface->isValid();
|
||||
}
|
||||
|
||||
WindowInfo::~WindowInfo()
|
||||
{
|
||||
}
|
||||
|
||||
bool WindowInfo::valid(bool withdrawn_is_valid) const
|
||||
{
|
||||
Q_UNUSED(withdrawn_is_valid)
|
||||
return m_valid;
|
||||
}
|
||||
|
||||
NET::States WindowInfo::state() const
|
||||
{
|
||||
return {};
|
||||
}
|
||||
|
||||
bool WindowInfo::isMinimized() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
NET::MappingState WindowInfo::mappingState() const
|
||||
{
|
||||
return NET::Visible;
|
||||
}
|
||||
|
||||
NETExtendedStrut WindowInfo::extendedStrut() const
|
||||
{
|
||||
return NETExtendedStrut();
|
||||
}
|
||||
|
||||
NET::WindowType WindowInfo::windowType(NET::WindowTypes supported_types) const
|
||||
{
|
||||
if (!m_plasmaShellSurface || !m_plasmaShellSurface->isValid()) {
|
||||
return NET::Unknown;
|
||||
}
|
||||
|
||||
if (m_properties & NET::WMWindowType) {
|
||||
switch (m_plasmaShellSurface->role()) {
|
||||
case KWayland::Client::PlasmaShellSurface::Role::Normal:
|
||||
if (supported_types & NET::NormalMask) {
|
||||
return NET::Normal;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::Desktop:
|
||||
if (supported_types & NET::DesktopMask) {
|
||||
return NET::Desktop;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::Panel:
|
||||
if (supported_types & NET::DockMask) {
|
||||
return NET::Dock;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::OnScreenDisplay:
|
||||
if (supported_types & NET::OnScreenDisplayMask) {
|
||||
return NET::OnScreenDisplay;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::Notification:
|
||||
if (supported_types & NET::NotificationMask) {
|
||||
return NET::Notification;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::ToolTip:
|
||||
if (supported_types & NET::TooltipMask) {
|
||||
return NET::Tooltip;
|
||||
}
|
||||
break;
|
||||
case KWayland::Client::PlasmaShellSurface::Role::CriticalNotification:
|
||||
if (supported_types & NET::CriticalNotificationMask) {
|
||||
return NET::CriticalNotification;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return NET::Unknown;
|
||||
}
|
||||
|
||||
QString WindowInfo::visibleName() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString WindowInfo::visibleNameWithState() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString WindowInfo::name() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString WindowInfo::visibleIconName() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString WindowInfo::visibleIconNameWithState() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
QString WindowInfo::iconName() const
|
||||
{
|
||||
return QString();
|
||||
}
|
||||
|
||||
bool WindowInfo::onAllDesktops() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WindowInfo::isOnDesktop(int desktop) const
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
return false;
|
||||
}
|
||||
|
||||
int WindowInfo::desktop() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
QStringList WindowInfo::activities() const
|
||||
{
|
||||
return QStringList();
|
||||
}
|
||||
|
||||
QRect WindowInfo::geometry() const
|
||||
{
|
||||
return QRect();
|
||||
}
|
||||
|
||||
QRect WindowInfo::frameGeometry() const
|
||||
{
|
||||
return QRect();
|
||||
}
|
||||
|
||||
WId WindowInfo::transientFor() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
WId WindowInfo::groupLeader() const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
QByteArray WindowInfo::windowClassClass() const
|
||||
{
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray WindowInfo::windowClassName() const
|
||||
{
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray WindowInfo::windowRole() const
|
||||
{
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
QByteArray WindowInfo::clientMachine() const
|
||||
{
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
bool WindowInfo::actionSupported(NET::Action action) const
|
||||
{
|
||||
Q_UNUSED(action)
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
|
||||
SPDX-FileCopyrightText: 2015 Marco Martin <mart@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef WINDOWINFO_H
|
||||
#define WINDOWINFO_H
|
||||
|
||||
#include <KWindowSystem/private/kwindowinfo_p.h>
|
||||
#include <kwindowinfo.h>
|
||||
|
||||
namespace KWayland
|
||||
{
|
||||
namespace Client
|
||||
{
|
||||
class Surface;
|
||||
class PlasmaShellSurface;
|
||||
}
|
||||
}
|
||||
|
||||
class WindowInfo : public KWindowInfoPrivate
|
||||
{
|
||||
public:
|
||||
WindowInfo(WId window, NET::Properties properties, NET::Properties2 properties2);
|
||||
~WindowInfo() override;
|
||||
|
||||
bool valid(bool withdrawn_is_valid) const override;
|
||||
NET::States state() const override;
|
||||
bool isMinimized() const override;
|
||||
NET::MappingState mappingState() const override;
|
||||
NETExtendedStrut extendedStrut() const override;
|
||||
NET::WindowType windowType(NET::WindowTypes supported_types) const override;
|
||||
QString visibleName() const override;
|
||||
QString visibleNameWithState() const override;
|
||||
QString name() const override;
|
||||
QString visibleIconName() const override;
|
||||
QString visibleIconNameWithState() const override;
|
||||
QString iconName() const override;
|
||||
bool onAllDesktops() const override;
|
||||
bool isOnDesktop(int desktop) const override;
|
||||
int desktop() const override;
|
||||
QStringList activities() const override;
|
||||
QRect geometry() const override;
|
||||
QRect frameGeometry() const override;
|
||||
WId transientFor() const override;
|
||||
WId groupLeader() const override;
|
||||
QByteArray windowClassClass() const override;
|
||||
QByteArray windowClassName() const override;
|
||||
QByteArray windowRole() const override;
|
||||
QByteArray clientMachine() const override;
|
||||
bool actionSupported(NET::Action action) const override;
|
||||
|
||||
private:
|
||||
bool m_valid;
|
||||
NET::Properties m_properties;
|
||||
NET::Properties2 m_properties2;
|
||||
KWayland::Client::Surface *m_surface;
|
||||
KWayland::Client::PlasmaShellSurface *m_plasmaShellSurface;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#include "windowshadow.h"
|
||||
#include "logging.h"
|
||||
#include "waylandintegration.h"
|
||||
|
||||
#include <KWayland/Client/shm_pool.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QExposeEvent>
|
||||
|
||||
WindowShadowTile::WindowShadowTile() {}
|
||||
WindowShadowTile::~WindowShadowTile() {}
|
||||
|
||||
bool WindowShadowTile::create()
|
||||
{
|
||||
m_shmPool.reset(WaylandIntegration::self()->createShmPool());
|
||||
if (!m_shmPool) {
|
||||
return false;
|
||||
}
|
||||
buffer = m_shmPool->createBuffer(image);
|
||||
return true;
|
||||
}
|
||||
|
||||
void WindowShadowTile::destroy()
|
||||
{
|
||||
buffer = nullptr;
|
||||
}
|
||||
|
||||
WindowShadowTile *WindowShadowTile::get(const KWindowShadowTile *tile)
|
||||
{
|
||||
KWindowShadowTilePrivate *d = KWindowShadowTilePrivate::get(tile);
|
||||
return static_cast<WindowShadowTile *>(d);
|
||||
}
|
||||
|
||||
static KWayland::Client::Buffer::Ptr bufferForTile(const KWindowShadowTile::Ptr &tile)
|
||||
{
|
||||
if (!tile) {
|
||||
return KWayland::Client::Buffer::Ptr();
|
||||
}
|
||||
WindowShadowTile *d = WindowShadowTile::get(tile.data());
|
||||
return d->buffer;
|
||||
}
|
||||
|
||||
bool WindowShadow::eventFilter(QObject *watched, QEvent *event)
|
||||
{
|
||||
Q_UNUSED(watched)
|
||||
if (event->type() == QEvent::Expose) {
|
||||
QExposeEvent *exposeEvent = static_cast<QExposeEvent *>(event);
|
||||
if (!exposeEvent->region().isNull()) {
|
||||
if (!internalCreate()) {
|
||||
qCWarning(KWAYLAND_KWS) << "Failed to recreate shadow for" << window;
|
||||
}
|
||||
}
|
||||
} else if (event->type() == QEvent::Hide) {
|
||||
internalDestroy();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool WindowShadow::internalCreate()
|
||||
{
|
||||
if (shadow) {
|
||||
return true;
|
||||
}
|
||||
KWayland::Client::ShadowManager *shadowManager = WaylandIntegration::self()->waylandShadowManager();
|
||||
if (!shadowManager) {
|
||||
return false;
|
||||
}
|
||||
KWayland::Client::Surface *surface = KWayland::Client::Surface::fromWindow(window);
|
||||
if (!surface) {
|
||||
return false;
|
||||
}
|
||||
|
||||
shadow = shadowManager->createShadow(surface, surface);
|
||||
shadow->attachLeft(bufferForTile(leftTile));
|
||||
shadow->attachTopLeft(bufferForTile(topLeftTile));
|
||||
shadow->attachTop(bufferForTile(topTile));
|
||||
shadow->attachTopRight(bufferForTile(topRightTile));
|
||||
shadow->attachRight(bufferForTile(rightTile));
|
||||
shadow->attachBottomRight(bufferForTile(bottomRightTile));
|
||||
shadow->attachBottom(bufferForTile(bottomTile));
|
||||
shadow->attachBottomLeft(bufferForTile(bottomLeftTile));
|
||||
shadow->setOffsets(padding);
|
||||
shadow->commit();
|
||||
|
||||
// Commit wl_surface at the next available time.
|
||||
window->requestUpdate();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool WindowShadow::create()
|
||||
{
|
||||
if (!internalCreate()) {
|
||||
return false;
|
||||
}
|
||||
window->installEventFilter(this);
|
||||
return true;
|
||||
}
|
||||
|
||||
void WindowShadow::internalDestroy()
|
||||
{
|
||||
delete shadow;
|
||||
shadow = nullptr;
|
||||
if (window) {
|
||||
window->requestUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
void WindowShadow::destroy()
|
||||
{
|
||||
if (window) {
|
||||
window->removeEventFilter(this);
|
||||
}
|
||||
internalDestroy();
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2020 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
|
||||
#ifndef WINDOWSHADOW_H
|
||||
#define WINDOWSHADOW_H
|
||||
|
||||
#include <KWayland/Client/buffer.h>
|
||||
#include <KWayland/Client/shadow.h>
|
||||
#include <KWindowSystem/private/kwindowshadow_p.h>
|
||||
|
||||
class WindowShadowTile final : public KWindowShadowTilePrivate
|
||||
{
|
||||
public:
|
||||
WindowShadowTile();
|
||||
~WindowShadowTile();
|
||||
|
||||
bool create() override;
|
||||
void destroy() override;
|
||||
|
||||
static WindowShadowTile *get(const KWindowShadowTile *tile);
|
||||
|
||||
KWayland::Client::Buffer::Ptr buffer;
|
||||
QScopedPointer<KWayland::Client::ShmPool> m_shmPool;
|
||||
};
|
||||
|
||||
class WindowShadow final : public QObject, public KWindowShadowPrivate
|
||||
{
|
||||
public:
|
||||
bool create() override;
|
||||
void destroy() override;
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *watched, QEvent *event) override;
|
||||
|
||||
private:
|
||||
bool internalCreate();
|
||||
void internalDestroy();
|
||||
|
||||
QPointer<KWayland::Client::Shadow> shadow;
|
||||
};
|
||||
|
||||
#endif // WINDOWSHADOW_H
|
|
@ -0,0 +1,546 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#include "windowsystem.h"
|
||||
#include "logging.h"
|
||||
#include "waylandintegration.h"
|
||||
#include "waylandxdgactivationv1_p.h"
|
||||
|
||||
#include <KWindowSystem/KWindowSystem>
|
||||
|
||||
#include <KWayland/Client/connection_thread.h>
|
||||
#include <KWayland/Client/plasmashell.h>
|
||||
#include <KWayland/Client/plasmawindowmanagement.h>
|
||||
#include <KWayland/Client/registry.h>
|
||||
#include <KWayland/Client/seat.h>
|
||||
#include <KWayland/Client/surface.h>
|
||||
|
||||
#include <QPixmap>
|
||||
#include <QPoint>
|
||||
#include <QString>
|
||||
#include <QWindow>
|
||||
#include <private/qwaylanddisplay_p.h>
|
||||
#include <private/qwaylandinputdevice_p.h>
|
||||
#include <private/qwaylandwindow_p.h>
|
||||
|
||||
using namespace KWayland::Client;
|
||||
|
||||
WindowSystem::WindowSystem()
|
||||
: QObject()
|
||||
, KWindowSystemPrivateV2()
|
||||
, m_lastToken(qEnvironmentVariable("XDG_ACTIVATION_TOKEN"))
|
||||
{
|
||||
}
|
||||
|
||||
void WindowSystem::activateWindow(WId win, long int time)
|
||||
{
|
||||
Q_UNUSED(time);
|
||||
Surface *s = Surface::fromQtWinId(win);
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
WaylandXdgActivationV1 *activation = WaylandIntegration::self()->activation();
|
||||
if (!activation) {
|
||||
return;
|
||||
}
|
||||
activation->activate(m_lastToken, *s);
|
||||
}
|
||||
|
||||
void WindowSystem::forceActiveWindow(WId win, long int time)
|
||||
{
|
||||
activateWindow(win, time);
|
||||
}
|
||||
|
||||
void WindowSystem::requestToken(QWindow *window, uint32_t serial, const QString &app_id)
|
||||
{
|
||||
Surface *surface = Surface::fromWindow(window);
|
||||
wl_surface *wlSurface = surface ? static_cast<wl_surface *>(*surface) : nullptr;
|
||||
WaylandXdgActivationV1 *activation = WaylandIntegration::self()->activation();
|
||||
if (!activation) {
|
||||
Q_EMIT KWindowSystem::self()->xdgActivationTokenArrived(serial, {});
|
||||
return;
|
||||
}
|
||||
|
||||
auto waylandWindow = window ? dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle()) : nullptr;
|
||||
auto seat = waylandWindow ? waylandWindow->display()->defaultInputDevice()->wl_seat() : nullptr;
|
||||
auto tokenReq = activation->requestXdgActivationToken(seat, wlSurface, serial, app_id);
|
||||
connect(tokenReq, &WaylandXdgActivationTokenV1::failed, KWindowSystem::self(), [serial, app_id]() {
|
||||
Q_EMIT KWindowSystem::self()->xdgActivationTokenArrived(serial, {});
|
||||
});
|
||||
connect(tokenReq, &WaylandXdgActivationTokenV1::done, KWindowSystem::self(), [serial](const QString &token) {
|
||||
Q_EMIT KWindowSystem::self()->xdgActivationTokenArrived(serial, token);
|
||||
});
|
||||
}
|
||||
|
||||
void WindowSystem::setCurrentToken(const QString &token)
|
||||
{
|
||||
m_lastToken = token;
|
||||
}
|
||||
|
||||
quint32 WindowSystem::lastInputSerial(QWindow *window)
|
||||
{
|
||||
auto waylandWindow = window ? dynamic_cast<QtWaylandClient::QWaylandWindow *>(window->handle()) : nullptr;
|
||||
if (!waylandWindow) {
|
||||
// Should never get here
|
||||
return 0;
|
||||
}
|
||||
return waylandWindow->display()->lastInputSerial();
|
||||
}
|
||||
|
||||
WId WindowSystem::activeWindow()
|
||||
{
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool WindowSystem::allowedActionsSupported()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void WindowSystem::allowExternalProcessWindowActivation(int pid)
|
||||
{
|
||||
Q_UNUSED(pid)
|
||||
}
|
||||
|
||||
bool WindowSystem::compositingActive()
|
||||
{
|
||||
// wayland is always composited
|
||||
return true;
|
||||
}
|
||||
|
||||
void WindowSystem::connectNotify(const QMetaMethod &signal)
|
||||
{
|
||||
Q_UNUSED(signal)
|
||||
}
|
||||
|
||||
QPoint WindowSystem::constrainViewportRelativePosition(const QPoint &pos)
|
||||
{
|
||||
Q_UNUSED(pos)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support viewport positions";
|
||||
return QPoint();
|
||||
}
|
||||
|
||||
int WindowSystem::currentDesktop()
|
||||
{
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
return 0;
|
||||
}
|
||||
|
||||
void WindowSystem::demandAttention(WId win, bool set)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(set)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support demanding attention";
|
||||
}
|
||||
|
||||
QString WindowSystem::desktopName(int desktop)
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
return QString();
|
||||
}
|
||||
|
||||
QPoint WindowSystem::desktopToViewport(int desktop, bool absolute)
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
Q_UNUSED(absolute)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support viewport positions";
|
||||
return QPoint();
|
||||
}
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 0)
|
||||
WId WindowSystem::groupLeader(WId window)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support group leader";
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool WindowSystem::icccmCompliantMappingState()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QPixmap WindowSystem::icon(WId win, int width, int height, bool scale, int flags)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(width)
|
||||
Q_UNUSED(height)
|
||||
Q_UNUSED(scale)
|
||||
Q_UNUSED(flags)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support getting window icons";
|
||||
return QPixmap();
|
||||
}
|
||||
|
||||
void WindowSystem::lowerWindow(WId win)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support lower window";
|
||||
}
|
||||
|
||||
bool WindowSystem::mapViewport()
|
||||
{
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support viewport positions";
|
||||
return false;
|
||||
}
|
||||
|
||||
void WindowSystem::minimizeWindow(WId win)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support minimizing windows";
|
||||
}
|
||||
|
||||
void WindowSystem::unminimizeWindow(WId win)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support unminimizing windows";
|
||||
}
|
||||
|
||||
int WindowSystem::numberOfDesktops()
|
||||
{
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
return 1;
|
||||
}
|
||||
|
||||
void WindowSystem::raiseWindow(WId win)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support raising windows";
|
||||
}
|
||||
|
||||
QString WindowSystem::readNameProperty(WId window, long unsigned int atom)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
Q_UNUSED(atom)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support reading X11 properties";
|
||||
return QString();
|
||||
}
|
||||
|
||||
void WindowSystem::setBlockingCompositing(WId window, bool active)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
Q_UNUSED(active)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support blocking compositing";
|
||||
}
|
||||
|
||||
void WindowSystem::setCurrentDesktop(int desktop)
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
}
|
||||
|
||||
void WindowSystem::setDesktopName(int desktop, const QString &name)
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
Q_UNUSED(name)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support virtual desktops";
|
||||
}
|
||||
|
||||
void WindowSystem::setExtendedStrut(WId win,
|
||||
int left_width,
|
||||
int left_start,
|
||||
int left_end,
|
||||
int right_width,
|
||||
int right_start,
|
||||
int right_end,
|
||||
int top_width,
|
||||
int top_start,
|
||||
int top_end,
|
||||
int bottom_width,
|
||||
int bottom_start,
|
||||
int bottom_end)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(left_width)
|
||||
Q_UNUSED(left_start)
|
||||
Q_UNUSED(left_end)
|
||||
Q_UNUSED(right_width)
|
||||
Q_UNUSED(right_start)
|
||||
Q_UNUSED(right_end)
|
||||
Q_UNUSED(top_width)
|
||||
Q_UNUSED(top_start)
|
||||
Q_UNUSED(top_end)
|
||||
Q_UNUSED(bottom_width)
|
||||
Q_UNUSED(bottom_start)
|
||||
Q_UNUSED(bottom_end)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support window struts";
|
||||
}
|
||||
|
||||
void WindowSystem::setStrut(WId win, int left, int right, int top, int bottom)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(left)
|
||||
Q_UNUSED(right)
|
||||
Q_UNUSED(top)
|
||||
Q_UNUSED(bottom)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support window struts";
|
||||
}
|
||||
|
||||
void WindowSystem::setIcons(WId win, const QPixmap &icon, const QPixmap &miniIcon)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(icon)
|
||||
Q_UNUSED(miniIcon)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support setting window icons";
|
||||
}
|
||||
|
||||
void WindowSystem::setOnActivities(WId win, const QStringList &activities)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(activities)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support activities";
|
||||
}
|
||||
|
||||
void WindowSystem::setOnAllDesktops(WId win, bool b)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(b)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support setting window on all desktops";
|
||||
}
|
||||
|
||||
void WindowSystem::setOnDesktop(WId win, int desktop)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(desktop)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support setting window on a specific desktop";
|
||||
}
|
||||
|
||||
void WindowSystem::setShowingDesktop(bool showing)
|
||||
{
|
||||
if (!WaylandIntegration::self()->plasmaWindowManagement()) {
|
||||
return;
|
||||
}
|
||||
WaylandIntegration::self()->plasmaWindowManagement()->setShowingDesktop(showing);
|
||||
}
|
||||
|
||||
void WindowSystem::clearState(WId win, NET::States state)
|
||||
{
|
||||
Surface *s = Surface::fromQtWinId(win);
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
|
||||
KWayland::Client::PlasmaShellSurface *plasmaShellSurface = nullptr;
|
||||
|
||||
if (state & NET::SkipTaskbar) {
|
||||
if (!WaylandIntegration::self()->waylandPlasmaShell()) {
|
||||
return;
|
||||
}
|
||||
plasmaShellSurface = PlasmaShellSurface::get(s);
|
||||
if (!plasmaShellSurface) {
|
||||
plasmaShellSurface = WaylandIntegration::self()->waylandPlasmaShell()->createSurface(s, this);
|
||||
}
|
||||
if (!plasmaShellSurface) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (state & NET::SkipTaskbar) {
|
||||
plasmaShellSurface->setSkipTaskbar(false);
|
||||
}
|
||||
|
||||
if (state & NET::Max) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Max window state";
|
||||
}
|
||||
if (state & NET::FullScreen) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing FullScreen window state";
|
||||
}
|
||||
if (state & NET::Modal) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Modal window state";
|
||||
}
|
||||
if (state & NET::Sticky) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Sticky window state";
|
||||
}
|
||||
if (state & NET::Shaded) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Shaded window state";
|
||||
}
|
||||
if (state & NET::KeepAbove) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing KeepAbove window state";
|
||||
}
|
||||
if (state & NET::KeepAbove) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing StaysOnTop window state";
|
||||
}
|
||||
if (state & NET::SkipPager) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing SkipPager window state";
|
||||
}
|
||||
if (state & NET::Hidden) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Hidden window state";
|
||||
}
|
||||
if (state & NET::KeepBelow) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing KeepBelow window state";
|
||||
}
|
||||
if (state & NET::DemandsAttention) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing DemandsAttention window state";
|
||||
}
|
||||
}
|
||||
|
||||
void WindowSystem::setState(WId win, NET::States state)
|
||||
{
|
||||
Surface *s = Surface::fromQtWinId(win);
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
|
||||
KWayland::Client::PlasmaShellSurface *plasmaShellSurface = nullptr;
|
||||
|
||||
if (state & NET::SkipTaskbar) {
|
||||
if (!WaylandIntegration::self()->waylandPlasmaShell()) {
|
||||
return;
|
||||
}
|
||||
plasmaShellSurface = PlasmaShellSurface::get(s);
|
||||
if (!plasmaShellSurface) {
|
||||
plasmaShellSurface = WaylandIntegration::self()->waylandPlasmaShell()->createSurface(s, this);
|
||||
}
|
||||
if (!plasmaShellSurface) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (state & NET::SkipTaskbar) {
|
||||
plasmaShellSurface->setSkipTaskbar(true);
|
||||
}
|
||||
|
||||
if (state & NET::Max) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Max window state";
|
||||
}
|
||||
if (state & NET::FullScreen) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing FullScreen window state";
|
||||
}
|
||||
if (state & NET::Modal) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Modal window state";
|
||||
}
|
||||
if (state & NET::Sticky) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Sticky window state";
|
||||
}
|
||||
if (state & NET::Shaded) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Shaded window state";
|
||||
}
|
||||
if (state & NET::KeepAbove) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing KeepAbove window state";
|
||||
}
|
||||
if (state & NET::KeepAbove) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing StaysOnTop window state";
|
||||
}
|
||||
if (state & NET::SkipPager) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing SkipPager window state";
|
||||
}
|
||||
if (state & NET::Hidden) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing Hidden window state";
|
||||
}
|
||||
if (state & NET::KeepBelow) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing KeepBelow window state";
|
||||
}
|
||||
if (state & NET::DemandsAttention) {
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support changing DemandsAttention window state";
|
||||
}
|
||||
}
|
||||
|
||||
void WindowSystem::setType(WId win, NET::WindowType windowType)
|
||||
{
|
||||
if (!WaylandIntegration::self()->waylandPlasmaShell()) {
|
||||
return;
|
||||
}
|
||||
KWayland::Client::PlasmaShellSurface::Role role;
|
||||
|
||||
switch (windowType) {
|
||||
case NET::Normal:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::Normal;
|
||||
break;
|
||||
case NET::Desktop:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::Desktop;
|
||||
break;
|
||||
case NET::Dock:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::Panel;
|
||||
break;
|
||||
case NET::OnScreenDisplay:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::OnScreenDisplay;
|
||||
break;
|
||||
case NET::Notification:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::Notification;
|
||||
break;
|
||||
case NET::Tooltip:
|
||||
case NET::PopupMenu:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::ToolTip;
|
||||
break;
|
||||
case NET::CriticalNotification:
|
||||
role = KWayland::Client::PlasmaShellSurface::Role::CriticalNotification;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
Surface *s = Surface::fromQtWinId(win);
|
||||
if (!s) {
|
||||
return;
|
||||
}
|
||||
KWayland::Client::PlasmaShellSurface *shellSurface = WaylandIntegration::self()->waylandPlasmaShell()->createSurface(s, this);
|
||||
|
||||
shellSurface->setRole(role);
|
||||
}
|
||||
|
||||
void WindowSystem::setUserTime(WId win, long int time)
|
||||
{
|
||||
Q_UNUSED(win)
|
||||
Q_UNUSED(time)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support setting user type";
|
||||
}
|
||||
|
||||
bool WindowSystem::showingDesktop()
|
||||
{
|
||||
if (!WaylandIntegration::self()->plasmaWindowManagement()) {
|
||||
return false;
|
||||
}
|
||||
return WaylandIntegration::self()->plasmaWindowManagement()->isShowingDesktop();
|
||||
}
|
||||
|
||||
QList<WId> WindowSystem::stackingOrder()
|
||||
{
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support getting windows";
|
||||
return QList<WId>();
|
||||
}
|
||||
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 0)
|
||||
WId WindowSystem::transientFor(WId window)
|
||||
{
|
||||
Q_UNUSED(window)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support transient for windows";
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int WindowSystem::viewportToDesktop(const QPoint &pos)
|
||||
{
|
||||
Q_UNUSED(pos)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support viewports";
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WindowSystem::viewportWindowToDesktop(const QRect &r)
|
||||
{
|
||||
Q_UNUSED(r)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support viewports";
|
||||
return 0;
|
||||
}
|
||||
|
||||
QList<WId> WindowSystem::windows()
|
||||
{
|
||||
return stackingOrder();
|
||||
}
|
||||
|
||||
QRect WindowSystem::workArea(const QList<WId> &excludes, int desktop)
|
||||
{
|
||||
Q_UNUSED(excludes)
|
||||
Q_UNUSED(desktop)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support work area";
|
||||
return QRect();
|
||||
}
|
||||
|
||||
QRect WindowSystem::workArea(int desktop)
|
||||
{
|
||||
Q_UNUSED(desktop)
|
||||
qCDebug(KWAYLAND_KWS) << "This plugin does not support work area";
|
||||
return QRect();
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
SPDX-FileCopyrightText: 2015 Martin Gräßlin <mgraesslin@kde.org>
|
||||
|
||||
SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
|
||||
*/
|
||||
#ifndef WINDOWSYSTEM_H
|
||||
#define WINDOWSYSTEM_H
|
||||
|
||||
#include <KWindowSystem/private/kwindowsystem_p.h>
|
||||
|
||||
#include <QObject>
|
||||
|
||||
namespace KWayland
|
||||
{
|
||||
namespace Client
|
||||
{
|
||||
class PlasmaShell;
|
||||
}
|
||||
}
|
||||
|
||||
class WindowSystem : public QObject, public KWindowSystemPrivateV2
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
WindowSystem();
|
||||
QList<WId> windows() override;
|
||||
QList<WId> stackingOrder() override;
|
||||
WId activeWindow() override;
|
||||
void activateWindow(WId win, long time) override;
|
||||
void forceActiveWindow(WId win, long time) override;
|
||||
void demandAttention(WId win, bool set) override;
|
||||
void requestToken(QWindow *win, uint32_t serial, const QString &app_id) override;
|
||||
quint32 lastInputSerial(QWindow *window) override;
|
||||
void setCurrentToken(const QString &token) override;
|
||||
bool compositingActive() override;
|
||||
int currentDesktop() override;
|
||||
int numberOfDesktops() override;
|
||||
void setCurrentDesktop(int desktop) override;
|
||||
void setOnAllDesktops(WId win, bool b) override;
|
||||
void setOnDesktop(WId win, int desktop) override;
|
||||
void setOnActivities(WId win, const QStringList &activities) override;
|
||||
#if KWINDOWSYSTEM_BUILD_DEPRECATED_SINCE(5, 0)
|
||||
WId transientFor(WId window) override;
|
||||
WId groupLeader(WId window) override;
|
||||
#endif
|
||||
QPixmap icon(WId win, int width, int height, bool scale, int flags) override;
|
||||
void setIcons(WId win, const QPixmap &icon, const QPixmap &miniIcon) override;
|
||||
void setType(WId win, NET::WindowType windowType) override;
|
||||
void setState(WId win, NET::States state) override;
|
||||
void clearState(WId win, NET::States state) override;
|
||||
void minimizeWindow(WId win) override;
|
||||
void unminimizeWindow(WId win) override;
|
||||
void raiseWindow(WId win) override;
|
||||
void lowerWindow(WId win) override;
|
||||
bool icccmCompliantMappingState() override;
|
||||
QRect workArea(int desktop) override;
|
||||
QRect workArea(const QList<WId> &excludes, int desktop) override;
|
||||
QString desktopName(int desktop) override;
|
||||
void setDesktopName(int desktop, const QString &name) override;
|
||||
bool showingDesktop() override;
|
||||
void setShowingDesktop(bool showing) override;
|
||||
void setUserTime(WId win, long time) override;
|
||||
void setExtendedStrut(WId win,
|
||||
int left_width,
|
||||
int left_start,
|
||||
int left_end,
|
||||
int right_width,
|
||||
int right_start,
|
||||
int right_end,
|
||||
int top_width,
|
||||
int top_start,
|
||||
int top_end,
|
||||
int bottom_width,
|
||||
int bottom_start,
|
||||
int bottom_end) override;
|
||||
void setStrut(WId win, int left, int right, int top, int bottom) override;
|
||||
bool allowedActionsSupported() override;
|
||||
QString readNameProperty(WId window, unsigned long atom) override;
|
||||
void allowExternalProcessWindowActivation(int pid) override;
|
||||
void setBlockingCompositing(WId window, bool active) override;
|
||||
bool mapViewport() override;
|
||||
int viewportToDesktop(const QPoint &pos) override;
|
||||
int viewportWindowToDesktop(const QRect &r) override;
|
||||
QPoint desktopToViewport(int desktop, bool absolute) override;
|
||||
QPoint constrainViewportRelativePosition(const QPoint &pos) override;
|
||||
void connectNotify(const QMetaMethod &signal) override;
|
||||
|
||||
private:
|
||||
KWayland::Client::PlasmaShell *m_waylandPlasmaShell = nullptr;
|
||||
QString m_lastToken;
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue