mirror of
https://github.com/ckb-next/ckb-next.git
synced 2026-10-10 12:27:21 -04:00
Fix wayland build on older distros
This commit add version check to wayland-protocols. Also enforce Qt 6 for Wayland.
This commit is contained in:
@@ -1,208 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2014 Alex Merry <[email protected]>
|
|
||||||
# SPDX-FileCopyrightText: 2014 Martin Gräßlin <[email protected]>
|
|
||||||
# SPDX-FileCopyrightText: 2025 Trần Nam Tuấn <[email protected]>
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
|
||||||
|
|
||||||
#[=======================================================================[.rst:
|
|
||||||
FindWayland
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Try to find Wayland.
|
|
||||||
|
|
||||||
This is a component-based find module, which makes use of the COMPONENTS
|
|
||||||
and OPTIONAL_COMPONENTS arguments to find_module. The following components
|
|
||||||
are available::
|
|
||||||
|
|
||||||
Client Server Cursor Egl
|
|
||||||
|
|
||||||
If no components are specified, this module will act as though all components
|
|
||||||
were passed to OPTIONAL_COMPONENTS.
|
|
||||||
|
|
||||||
This module will define the following variables, independently of the
|
|
||||||
components searched for or found:
|
|
||||||
|
|
||||||
``Wayland_FOUND``
|
|
||||||
TRUE if (the requested version of) Wayland is available
|
|
||||||
``Wayland_VERSION``
|
|
||||||
Found Wayland version
|
|
||||||
``Wayland_TARGETS``
|
|
||||||
A list of all targets imported by this module (note that there may be more
|
|
||||||
than the components that were requested)
|
|
||||||
``Wayland_LIBRARIES``
|
|
||||||
This can be passed to target_link_libraries() instead of the imported
|
|
||||||
targets
|
|
||||||
``Wayland_INCLUDE_DIRS``
|
|
||||||
This should be passed to target_include_directories() if the targets are
|
|
||||||
not used for linking
|
|
||||||
``Wayland_DEFINITIONS``
|
|
||||||
This should be passed to target_compile_options() if the targets are not
|
|
||||||
used for linking
|
|
||||||
``Wayland_DATADIR``
|
|
||||||
The core wayland protocols data directory
|
|
||||||
|
|
||||||
For each searched-for components, ``Wayland_<component>_FOUND`` will be set to
|
|
||||||
TRUE if the corresponding Wayland library was found, and FALSE otherwise. If
|
|
||||||
``Wayland_<component>_FOUND`` is TRUE, the imported target
|
|
||||||
``Wayland::<component>`` will be defined. This module will also attempt to
|
|
||||||
determine ``Wayland_*_VERSION`` variables for each imported target, although
|
|
||||||
``Wayland_VERSION`` should normally be sufficient.
|
|
||||||
|
|
||||||
In general we recommend using the imported targets, as they are easier to use
|
|
||||||
and provide more control. Bear in mind, however, that if any target is in the
|
|
||||||
link interface of an exported library, it must be made available by the
|
|
||||||
package config file.
|
|
||||||
#]=======================================================================]
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
|
|
||||||
set(Wayland_known_components
|
|
||||||
Client
|
|
||||||
Server
|
|
||||||
Cursor
|
|
||||||
Egl
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach(_comp ${Wayland_known_components})
|
|
||||||
string(TOLOWER "${_comp}" _lc_comp)
|
|
||||||
set(Wayland_${_comp}_component_deps)
|
|
||||||
set(Wayland_${_comp}_pkg_config "wayland-${_lc_comp}")
|
|
||||||
set(Wayland_${_comp}_lib "wayland-${_lc_comp}")
|
|
||||||
set(Wayland_${_comp}_header "wayland-${_lc_comp}.h")
|
|
||||||
endforeach()
|
|
||||||
set(Wayland_Egl_component_deps Client)
|
|
||||||
|
|
||||||
find_package(PkgConfig REQUIRED)
|
|
||||||
|
|
||||||
foreach(_comp ${Wayland_known_components})
|
|
||||||
# Handling components dependencies
|
|
||||||
foreach(_dep ${Wayland_${_comp}_component_deps})
|
|
||||||
list(APPEND _dep_vars "Wayland_${_dep}_FOUND")
|
|
||||||
list(APPEND _dep_targets "Wayland::${_dep}")
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
pkg_check_modules(PKG_Wayland_${_comp} QUIET ${Wayland_${_comp}_pkg_config})
|
|
||||||
|
|
||||||
find_path(Wayland_${_comp}_INCLUDE_DIR
|
|
||||||
NAMES ${Wayland_${_comp}_header}
|
|
||||||
HINTS ${PKG_Wayland_${_comp}_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
find_library(Wayland_${_comp}_LIBRARY
|
|
||||||
NAMES ${Wayland_${_comp}_lib}
|
|
||||||
HINTS ${PKG_Wayland_${_comp}_LIBRARY_DIRS}
|
|
||||||
)
|
|
||||||
|
|
||||||
set(Wayland_${_comp}_VERSION "${PKG_Wayland_${_comp}_VERSION}")
|
|
||||||
if(NOT Wayland_VERSION)
|
|
||||||
set(Wayland_VERSION ${Wayland_${_comp}_VERSION})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(FPHSA_NAME_MISMATCHED 1)
|
|
||||||
find_package_handle_standard_args(Wayland_${_comp}
|
|
||||||
FOUND_VAR
|
|
||||||
Wayland_${_comp}_FOUND
|
|
||||||
REQUIRED_VARS
|
|
||||||
Wayland_${_comp}_LIBRARY
|
|
||||||
Wayland_${_comp}_INCLUDE_DIR
|
|
||||||
${_dep_vars}
|
|
||||||
VERSION_VAR
|
|
||||||
Wayland_${_comp}_VERSION
|
|
||||||
)
|
|
||||||
unset(FPHSA_NAME_MISMATCHED)
|
|
||||||
|
|
||||||
mark_as_advanced(
|
|
||||||
Wayland_${_comp}_LIBRARY
|
|
||||||
Wayland_${_comp}_INCLUDE_DIR
|
|
||||||
)
|
|
||||||
|
|
||||||
if(Wayland_${_comp}_FOUND)
|
|
||||||
list(APPEND Wayland_LIBRARIES
|
|
||||||
"${Wayland_${_comp}_LIBRARY}")
|
|
||||||
list(APPEND Wayland_INCLUDE_DIRS
|
|
||||||
"${Wayland_${_comp}_INCLUDE_DIR}")
|
|
||||||
set(Wayland_DEFINITIONS
|
|
||||||
${Wayland_DEFINITIONS}
|
|
||||||
${PKG_Wayland_${_comp}_DEFINITIONS})
|
|
||||||
if(NOT TARGET Wayland::${_comp})
|
|
||||||
add_library(Wayland::${_comp} UNKNOWN IMPORTED)
|
|
||||||
set_target_properties(Wayland::${_comp} PROPERTIES
|
|
||||||
IMPORTED_LOCATION "${Wayland_${_comp}_LIBRARY}"
|
|
||||||
INTERFACE_COMPILE_OPTIONS "${PKG_Wayland_${_comp}_DEFINITIONS}"
|
|
||||||
INTERFACE_INCLUDE_DIRECTORIES "${Wayland_${_comp}_INCLUDE_DIR}"
|
|
||||||
INTERFACE_LINK_LIBRARIES "${_dep_targets}"
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
list(APPEND Wayland_TARGETS
|
|
||||||
"Wayland::${_comp}")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
if(Wayland_LIBRARIES)
|
|
||||||
list(REMOVE_DUPLICATES Wayland_LIBRARIES)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(Wayland_INCLUDE_DIRS)
|
|
||||||
list(REMOVE_DUPLICATES Wayland_INCLUDE_DIRS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(Wayland_DEFINITIONS)
|
|
||||||
list(REMOVE_DUPLICATES Wayland_DEFINITIONS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(Wayland_TARGETS)
|
|
||||||
list(REMOVE_DUPLICATES Wayland_TARGETS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# If pkg-config didn't provide us with version information,
|
|
||||||
# try to extract it from wayland-version.h
|
|
||||||
# (Note that the version from wayland-egl.pc will probably be
|
|
||||||
# the Mesa version, rather than the Wayland version, but that
|
|
||||||
# version will be ignored as we always find wayland-client.pc
|
|
||||||
# first).
|
|
||||||
if(NOT Wayland_VERSION)
|
|
||||||
find_file(Wayland_VERSION_HEADER
|
|
||||||
NAMES wayland-version.h
|
|
||||||
HINTS ${Wayland_INCLUDE_DIRS}
|
|
||||||
)
|
|
||||||
mark_as_advanced(Wayland_VERSION_HEADER)
|
|
||||||
if(Wayland_VERSION_HEADER)
|
|
||||||
file(READ ${Wayland_VERSION_HEADER} _wayland_version_header_contents)
|
|
||||||
string(REGEX REPLACE
|
|
||||||
"^.*[ \t]+WAYLAND_VERSION[ \t]+\"([0-9.]*)\".*$"
|
|
||||||
"\\1"
|
|
||||||
Wayland_VERSION
|
|
||||||
"${_wayland_version_header_contents}"
|
|
||||||
)
|
|
||||||
unset(_wayland_version_header_contents)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package_handle_standard_args(Wayland
|
|
||||||
FOUND_VAR
|
|
||||||
Wayland_FOUND
|
|
||||||
REQUIRED_VARS
|
|
||||||
Wayland_LIBRARIES
|
|
||||||
VERSION_VAR
|
|
||||||
Wayland_VERSION
|
|
||||||
HANDLE_COMPONENTS
|
|
||||||
)
|
|
||||||
|
|
||||||
pkg_get_variable(Wayland_DATADIR wayland-scanner pkgdatadir)
|
|
||||||
if (CMAKE_CROSSCOMPILING AND (NOT EXISTS "${Wayland_DATADIR}/wayland.xml"))
|
|
||||||
# PKG_CONFIG_SYSROOT_DIR only applies to -I and -L flags, so pkg-config
|
|
||||||
# does not prepend CMAKE_SYSROOT when cross-compiling unless you pass
|
|
||||||
# --define-prefix explicitly. Therefore we have to manually do prepend
|
|
||||||
# it here when cross-compiling.
|
|
||||||
# See https://gitlab.kitware.com/cmake/cmake/-/issues/16647#note_844761
|
|
||||||
set(Wayland_DATADIR ${CMAKE_SYSROOT}${Wayland_DATADIR})
|
|
||||||
endif()
|
|
||||||
if (NOT EXISTS "${Wayland_DATADIR}/wayland.xml")
|
|
||||||
message(WARNING "Could not find wayland.xml in ${Wayland_DATADIR}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FeatureSummary)
|
|
||||||
set_package_properties(Wayland PROPERTIES
|
|
||||||
URL "https://wayland.freedesktop.org/"
|
|
||||||
DESCRIPTION "C library implementation of the Wayland protocol: a protocol for a compositor to talk to its clients"
|
|
||||||
)
|
|
||||||
+13
-6
@@ -102,6 +102,10 @@ elseif (LINUX)
|
|||||||
find_package(Qt5 REQUIRED COMPONENTS X11Extras)
|
find_package(Qt5 REQUIRED COMPONENTS X11Extras)
|
||||||
endif ()
|
endif ()
|
||||||
message(STATUS "Using Qt${QT_VERSION_MAJOR}")
|
message(STATUS "Using Qt${QT_VERSION_MAJOR}")
|
||||||
|
if (QT_VERSION VERSION_LESS "6" AND USE_WAYLAND)
|
||||||
|
set(USE_WAYLAND OFF)
|
||||||
|
message(STATUS "Wayland features disabled (requires Qt 6)")
|
||||||
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Automatically handle MOC, UIC and RCC
|
# Automatically handle MOC, UIC and RCC
|
||||||
@@ -413,11 +417,9 @@ elseif (LINUX)
|
|||||||
)
|
)
|
||||||
|
|
||||||
if (USE_WAYLAND)
|
if (USE_WAYLAND)
|
||||||
find_package(Wayland COMPONENTS Client REQUIRED)
|
|
||||||
find_package(WaylandProtocols REQUIRED)
|
|
||||||
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS WaylandClient)
|
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS WaylandClient)
|
||||||
|
find_package(WaylandProtocols 1.27 REQUIRED)
|
||||||
|
|
||||||
if (QT_VERSION VERSION_GREATER_EQUAL "6.0.0")
|
|
||||||
if (NOT EXISTS ${WaylandProtocols_DATADIR}/staging/ext-idle-notify/ext-idle-notify-v1.xml)
|
if (NOT EXISTS ${WaylandProtocols_DATADIR}/staging/ext-idle-notify/ext-idle-notify-v1.xml)
|
||||||
message(FATAL_ERROR "Wayland ext-idle-notify-v1 protocol is not found. Either install them or pass -DUSE_WAYLAND=0 to disable idle detection.")
|
message(FATAL_ERROR "Wayland ext-idle-notify-v1 protocol is not found. Either install them or pass -DUSE_WAYLAND=0 to disable idle detection.")
|
||||||
endif ()
|
endif ()
|
||||||
@@ -445,9 +447,6 @@ elseif (LINUX)
|
|||||||
PRIVATE
|
PRIVATE
|
||||||
USE_WAYLAND_IDLE_NOTIFY
|
USE_WAYLAND_IDLE_NOTIFY
|
||||||
)
|
)
|
||||||
else()
|
|
||||||
message(FATAL_ERROR "Wayland idle detection required Qt 6 or later. Either build with Qt 6 or pass -DUSE_WAYLAND=0 to disable idle detection.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
ckb-next
|
ckb-next
|
||||||
@@ -462,6 +461,14 @@ elseif (LINUX)
|
|||||||
Qt${QT_VERSION_MAJOR}::WaylandClient
|
Qt${QT_VERSION_MAJOR}::WaylandClient
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if (WaylandProtocols_VERSION VERSION_GREATER_EQUAL "1.40")
|
||||||
|
target_compile_definitions(
|
||||||
|
ckb-next
|
||||||
|
PRIVATE
|
||||||
|
USE_WAYLAND_INPUT_IDLE_NOTIFY
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (Qt6_VERSION VERSION_LESS "6.5.0")
|
if (Qt6_VERSION VERSION_LESS "6.5.0")
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
ckb-next
|
ckb-next
|
||||||
|
|||||||
@@ -57,11 +57,15 @@ WaylandIdleTimer::WaylandIdleTimer()
|
|||||||
if (m_supported) {
|
if (m_supported) {
|
||||||
auto seat = WaylandUtils::seat();
|
auto seat = WaylandUtils::seat();
|
||||||
m_notifier.reset(new WaylandIdleNotifier());
|
m_notifier.reset(new WaylandIdleNotifier());
|
||||||
|
#ifdef USE_WAYLAND_INPUT_IDLE_NOTIFY
|
||||||
if (WaylandUtils::hasInterface("ext_idle_notifier_v1", 2)) {
|
if (WaylandUtils::hasInterface("ext_idle_notifier_v1", 2)) {
|
||||||
m_notification.reset(new WaylandIdleNotification(m_notifier->get_input_idle_notification(0, seat)));
|
m_notification.reset(new WaylandIdleNotification(m_notifier->get_input_idle_notification(0, seat)));
|
||||||
} else {
|
} else {
|
||||||
m_notification.reset(new WaylandIdleNotification(m_notifier->get_idle_notification(0, seat)));
|
m_notification.reset(new WaylandIdleNotification(m_notifier->get_idle_notification(0, seat)));
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
m_notification.reset(new WaylandIdleNotification(m_notifier->get_idle_notification(0, seat)));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_seat = static_cast<m_seat *>(nativeInterface->nativeResourceForIntegration("m_seat"));
|
m_seat = static_cast<wl_seat *>(nativeInterface->nativeResourceForIntegration("m_seat"));
|
||||||
if (!m_seat) {
|
if (!m_seat) {
|
||||||
m_display = nullptr;
|
m_display = nullptr;
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user