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)
|
||||
endif ()
|
||||
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 ()
|
||||
|
||||
# Automatically handle MOC, UIC and RCC
|
||||
@@ -413,11 +417,9 @@ elseif (LINUX)
|
||||
)
|
||||
|
||||
if (USE_WAYLAND)
|
||||
find_package(Wayland COMPONENTS Client REQUIRED)
|
||||
find_package(WaylandProtocols REQUIRED)
|
||||
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)
|
||||
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 ()
|
||||
@@ -445,9 +447,6 @@ elseif (LINUX)
|
||||
PRIVATE
|
||||
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(
|
||||
ckb-next
|
||||
@@ -462,6 +461,14 @@ elseif (LINUX)
|
||||
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")
|
||||
target_link_libraries(
|
||||
ckb-next
|
||||
|
||||
@@ -57,11 +57,15 @@ WaylandIdleTimer::WaylandIdleTimer()
|
||||
if (m_supported) {
|
||||
auto seat = WaylandUtils::seat();
|
||||
m_notifier.reset(new WaylandIdleNotifier());
|
||||
#ifdef USE_WAYLAND_INPUT_IDLE_NOTIFY
|
||||
if (WaylandUtils::hasInterface("ext_idle_notifier_v1", 2)) {
|
||||
m_notification.reset(new WaylandIdleNotification(m_notifier->get_input_idle_notification(0, seat)));
|
||||
} else {
|
||||
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;
|
||||
}
|
||||
|
||||
m_seat = static_cast<m_seat *>(nativeInterface->nativeResourceForIntegration("m_seat"));
|
||||
m_seat = static_cast<wl_seat *>(nativeInterface->nativeResourceForIntegration("m_seat"));
|
||||
if (!m_seat) {
|
||||
m_display = nullptr;
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user