build: Require libei and libportal from the system on linux
Removing remaining meson parts
This commit is contained in:
parent
2136af68b5
commit
7b7ff81a9f
22 changed files with 17 additions and 441 deletions
48
.github/workflows/build-containers.yml
vendored
48
.github/workflows/build-containers.yml
vendored
|
|
@ -32,30 +32,6 @@ jobs:
|
||||||
base-image: debian:trixie-slim
|
base-image: debian:trixie-slim
|
||||||
platform: amd64
|
platform: amd64
|
||||||
|
|
||||||
- name: debian-12-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: debian
|
|
||||||
base-image: debian:12-slim
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: debian-12-arm64
|
|
||||||
runs-on: ubuntu-24.04-2-core-arm64
|
|
||||||
config-dir: debian
|
|
||||||
base-image: arm64v8/debian:12-slim
|
|
||||||
platform: arm64
|
|
||||||
|
|
||||||
- name: ubuntu-24.04-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: debian
|
|
||||||
base-image: ubuntu:24.04
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: ubuntu-22.04-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: debian
|
|
||||||
base-image: ubuntu:22.04
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: fedora-40-amd64
|
- name: fedora-40-amd64
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
config-dir: fedora
|
config-dir: fedora
|
||||||
|
|
@ -68,24 +44,6 @@ jobs:
|
||||||
base-image: arm64v8/fedora:40
|
base-image: arm64v8/fedora:40
|
||||||
platform: arm64
|
platform: arm64
|
||||||
|
|
||||||
- name: fedora-39-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: fedora
|
|
||||||
base-image: fedora:39
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: rockylinux-9-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: fedora
|
|
||||||
base-image: rockylinux:9
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: almalinux-9-amd64
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
config-dir: fedora
|
|
||||||
base-image: almalinux:9
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
- name: opensuse-amd64
|
- name: opensuse-amd64
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
config-dir: opensuse
|
config-dir: opensuse
|
||||||
|
|
@ -98,12 +56,6 @@ jobs:
|
||||||
base-image: archlinux:latest
|
base-image: archlinux:latest
|
||||||
platform: amd64
|
platform: amd64
|
||||||
|
|
||||||
- name: manjaro-amd64
|
|
||||||
config-dir: archlinux
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
base-image: manjarolinux/base:latest
|
|
||||||
platform: amd64
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
|
||||||
46
.github/workflows/ci-linux.json
vendored
46
.github/workflows/ci-linux.json
vendored
|
|
@ -4,31 +4,6 @@
|
||||||
"name": "debian-13-amd64",
|
"name": "debian-13-amd64",
|
||||||
"container": "deskflow/deskflow:debian-13-amd64",
|
"container": "deskflow/deskflow:debian-13-amd64",
|
||||||
"runs-on": "ubuntu-latest",
|
"runs-on": "ubuntu-latest",
|
||||||
"extra-packages": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "debian-12-arm64",
|
|
||||||
"container": "deskflow/deskflow:debian-12-arm64",
|
|
||||||
"runs-on": "ubuntu-24.04-4-core-arm64",
|
|
||||||
"extra-packages": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "debian-12-amd64",
|
|
||||||
"container": "deskflow/deskflow:debian-12-amd64",
|
|
||||||
"runs-on": "ubuntu-latest",
|
|
||||||
"extra-packages": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ubuntu-24.04-amd64",
|
|
||||||
"container": "deskflow/deskflow:ubuntu-24.04-amd64",
|
|
||||||
"runs-on": "ubuntu-latest",
|
|
||||||
"extra-dep-args": "--meson-no-system libportal --meson-static libportal --subprojects",
|
|
||||||
"extra-cmake-args": "-DSYSTEM_LIBPORTAL=OFF -DSTATIC_LIBPORTAL=ON"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ubuntu-22.04-amd64",
|
|
||||||
"container": "deskflow/deskflow:ubuntu-22.04-amd64",
|
|
||||||
"runs-on": "ubuntu-latest"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "fedora-40-arm64",
|
"name": "fedora-40-arm64",
|
||||||
|
|
@ -40,37 +15,16 @@
|
||||||
"container": "deskflow/deskflow:fedora-40-amd64",
|
"container": "deskflow/deskflow:fedora-40-amd64",
|
||||||
"runs-on": "ubuntu-latest"
|
"runs-on": "ubuntu-latest"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "fedora-39-amd64",
|
|
||||||
"container": "deskflow/deskflow:fedora-39-amd64",
|
|
||||||
"runs-on": "ubuntu-latest"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "opensuse-amd64",
|
"name": "opensuse-amd64",
|
||||||
"container": "deskflow/deskflow:opensuse-amd64",
|
"container": "deskflow/deskflow:opensuse-amd64",
|
||||||
"runs-on": "ubuntu-latest"
|
"runs-on": "ubuntu-latest"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "rockylinux-9-amd64",
|
|
||||||
"container": "deskflow/deskflow:rockylinux-9-amd64",
|
|
||||||
"runs-on": "ubuntu-latest"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "almalinux-9-amd64",
|
|
||||||
"container": "deskflow/deskflow:almalinux-9-amd64",
|
|
||||||
"runs-on": "ubuntu-latest"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "archlinux-amd64",
|
"name": "archlinux-amd64",
|
||||||
"container": "deskflow/deskflow:archlinux-amd64",
|
"container": "deskflow/deskflow:archlinux-amd64",
|
||||||
"runs-on": "ubuntu-latest",
|
"runs-on": "ubuntu-latest",
|
||||||
"arch-like": "true"
|
"arch-like": "true"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "manjaro-amd64",
|
|
||||||
"container": "deskflow/deskflow:manjaro-amd64",
|
|
||||||
"runs-on": "ubuntu-latest",
|
|
||||||
"arch-like": "true"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,6 @@ macro(configure_wayland_libs)
|
||||||
include(FindPkgConfig)
|
include(FindPkgConfig)
|
||||||
|
|
||||||
if(PKG_CONFIG_FOUND)
|
if(PKG_CONFIG_FOUND)
|
||||||
configure_libei()
|
|
||||||
configure_libportal()
|
configure_libportal()
|
||||||
|
|
||||||
pkg_check_modules(LIBXKBCOMMON REQUIRED xkbcommon)
|
pkg_check_modules(LIBXKBCOMMON REQUIRED xkbcommon)
|
||||||
|
|
@ -214,41 +213,10 @@ macro(configure_wayland_libs)
|
||||||
|
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
macro(configure_libei)
|
|
||||||
option(SYSTEM_LIBEI "Use system libei" ON)
|
|
||||||
if(SYSTEM_LIBEI)
|
|
||||||
pkg_check_modules(LIBEI QUIET "libei-1.0 >= ${LIBEI_MIN_VERSION}")
|
|
||||||
if(LIBEI_FOUND)
|
|
||||||
message(STATUS "libei version: ${LIBEI_VERSION}")
|
|
||||||
add_definitions(-DWINAPI_LIBEI=1)
|
|
||||||
include_directories(${LIBEI_INCLUDE_DIRS})
|
|
||||||
else()
|
|
||||||
message(WARNING "libei >= ${LIBEI_MIN_VERSION} not found")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
set(libei_bin_dir ${PROJECT_BINARY_DIR}/meson/subprojects/libei/src)
|
|
||||||
set(libei_src_dir ${PROJECT_SOURCE_DIR}/subprojects/libei)
|
|
||||||
find_library(
|
|
||||||
LIBEI_LINK_LIBRARIES
|
|
||||||
NAMES ei
|
|
||||||
PATHS ${libei_bin_dir}
|
|
||||||
NO_DEFAULT_PATH)
|
|
||||||
if(LIBEI_LINK_LIBRARIES)
|
|
||||||
message(STATUS "Using local subproject libei")
|
|
||||||
set(LIBEI_FOUND true)
|
|
||||||
add_definitions(-DWINAPI_LIBEI=1)
|
|
||||||
set(LIBEI_INCLUDE_DIRS ${libei_src_dir}/src)
|
|
||||||
include_directories(${LIBEI_INCLUDE_DIRS})
|
|
||||||
else()
|
|
||||||
message(WARNING "Local libei not found")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro(configure_libportal)
|
macro(configure_libportal)
|
||||||
option(SYSTEM_LIBPORTAL "Use system libportal" ON)
|
option(SYSTEM_LIBPORTAL "Use system libportal" ON)
|
||||||
if(SYSTEM_LIBPORTAL)
|
if(SYSTEM_LIBPORTAL)
|
||||||
pkg_check_modules(LIBPORTAL QUIET "libportal >= ${LIBPORTAL_MIN_VERSION}")
|
pkg_check_modules(LIBPORTAL REQUIRED QUIET "libportal >= ${LIBPORTAL_MIN_VERSION}")
|
||||||
if(LIBPORTAL_FOUND)
|
if(LIBPORTAL_FOUND)
|
||||||
message(STATUS "libportal version: ${LIBPORTAL_VERSION}")
|
message(STATUS "libportal version: ${LIBPORTAL_VERSION}")
|
||||||
check_libportal()
|
check_libportal()
|
||||||
|
|
|
||||||
31
meson.build
31
meson.build
|
|
@ -1,31 +0,0 @@
|
||||||
# For now, we're only using Meson to resolve dependencies. CMake is called separately.
|
|
||||||
# In future, we may completely replace CMake with Meson.
|
|
||||||
# Where available, we use system packages, otherwise we use subprojects.
|
|
||||||
# Subprojects are also used to get the latest version during development.
|
|
||||||
|
|
||||||
project('deskflow', 'cpp')
|
|
||||||
|
|
||||||
if host_machine.system() == 'linux'
|
|
||||||
|
|
||||||
system_libei = get_option('system-libei')
|
|
||||||
if system_libei
|
|
||||||
dependency('libei-1.0', required: false)
|
|
||||||
else
|
|
||||||
# Using the subproject is only useful for development; it's not intended for normal use.
|
|
||||||
# GNOME46 or above is required as this has the required bits for libei.
|
|
||||||
# Building on anything older is pointless as you won't be able to actually connect to anything.
|
|
||||||
subproject('libei', default_options: ['tests=disabled', 'liboeffis=disabled'])
|
|
||||||
endif
|
|
||||||
|
|
||||||
system_libportal = get_option('system-libportal')
|
|
||||||
if system_libportal
|
|
||||||
dependency('libportal', required: false)
|
|
||||||
else
|
|
||||||
# Using the subproject is only useful for development; it's not intended for normal use.
|
|
||||||
subproject('libportal', default_options: [
|
|
||||||
'docs=false',
|
|
||||||
'backend-gtk3=enabled',
|
|
||||||
'backend-qt6=disabled'
|
|
||||||
])
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
option('system-libportal', type: 'boolean', value: true, description: 'Use system libportal')
|
|
||||||
option('system-libei', type: 'boolean', value: true, description: 'Use system libei')
|
|
||||||
|
|
@ -20,7 +20,6 @@ import lib.env as env
|
||||||
import lib.cmd_utils as cmd_utils
|
import lib.cmd_utils as cmd_utils
|
||||||
import lib.qt_utils as qt_utils
|
import lib.qt_utils as qt_utils
|
||||||
import lib.github as github
|
import lib.github as github
|
||||||
import lib.meson as meson
|
|
||||||
|
|
||||||
path_env_var = "PATH"
|
path_env_var = "PATH"
|
||||||
cmake_prefix_env_var = "CMAKE_PREFIX_PATH"
|
cmake_prefix_env_var = "CMAKE_PREFIX_PATH"
|
||||||
|
|
@ -80,29 +79,6 @@ def parse_args(is_ci):
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="Do not install system dependencies (apt, dnf, etc)",
|
help="Do not install system dependencies (apt, dnf, etc)",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
|
||||||
"--skip-meson", action="store_true", help="Do not setup and compile with Meson"
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--subprojects",
|
|
||||||
action="store_true",
|
|
||||||
help="Install dependencies for Meson subprojects (use with --meson-no-system)",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--meson-install",
|
|
||||||
action="store_true",
|
|
||||||
help="Install built Meson subprojects to system",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--meson-no-system",
|
|
||||||
nargs="+",
|
|
||||||
help="Specify which Meson subprojects to use instead of system dependencies",
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"--meson-static",
|
|
||||||
nargs="+",
|
|
||||||
help="Specify which Meson subprojects to build as static libraries",
|
|
||||||
)
|
|
||||||
|
|
||||||
if env.is_windows():
|
if env.is_windows():
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
|
@ -177,30 +153,6 @@ def install(args):
|
||||||
|
|
||||||
vcpkg.install(args.ci_env)
|
vcpkg.install(args.ci_env)
|
||||||
|
|
||||||
if not args.skip_meson:
|
|
||||||
if args.subprojects:
|
|
||||||
for subproject in args.meson_no_system or []:
|
|
||||||
deps = SubprojectDependencies(subproject)
|
|
||||||
deps.install()
|
|
||||||
|
|
||||||
run_meson(args.meson_install, args.meson_no_system, args.meson_static)
|
|
||||||
|
|
||||||
|
|
||||||
# It's a bit weird to use Meson just for installing deps, but it's a stopgap until
|
|
||||||
# we fully switch from CMake to Meson. For the meantime, Meson will install the deps
|
|
||||||
# so that CMake can find them easily. Once we switch to Meson, it might be possible for
|
|
||||||
# Meson handle the deps resolution, so that we won't need to install them on the system.
|
|
||||||
def run_meson(install, no_system_list, static_list):
|
|
||||||
meson.setup(no_system_list, static_list)
|
|
||||||
|
|
||||||
# Only compile and install on Linux for now, since we're only using Meson to fetch
|
|
||||||
# the deps on Windows and macOS.
|
|
||||||
if env.is_linux():
|
|
||||||
meson.compile()
|
|
||||||
|
|
||||||
if install:
|
|
||||||
meson.install()
|
|
||||||
|
|
||||||
|
|
||||||
class Dependencies:
|
class Dependencies:
|
||||||
|
|
||||||
|
|
@ -318,38 +270,5 @@ class Dependencies:
|
||||||
|
|
||||||
linux.run_command(command, check=True)
|
linux.run_command(command, check=True)
|
||||||
|
|
||||||
subprojects = self.config.get_os_subprojects()
|
|
||||||
if subprojects:
|
|
||||||
for subproject in subprojects:
|
|
||||||
deps = SubprojectDependencies(subproject)
|
|
||||||
deps.install()
|
|
||||||
|
|
||||||
|
|
||||||
class SubprojectDependencies:
|
|
||||||
|
|
||||||
def __init__(self, subproject):
|
|
||||||
from lib.config import Config
|
|
||||||
|
|
||||||
self.subproject = subproject
|
|
||||||
self.config = Config()
|
|
||||||
|
|
||||||
def install(self):
|
|
||||||
"""Installs dependencies for the current platform."""
|
|
||||||
|
|
||||||
print(f"Installing dependencies for sub-project: {self.subproject}")
|
|
||||||
|
|
||||||
if env.is_linux():
|
|
||||||
self.linux()
|
|
||||||
else:
|
|
||||||
raise RuntimeError(f"Unsupported platform: {os}")
|
|
||||||
|
|
||||||
def linux(self):
|
|
||||||
"""Installs dependencies on Linux."""
|
|
||||||
import lib.linux as linux
|
|
||||||
|
|
||||||
command = self.config.get_subproject_deps_command(self.subproject)
|
|
||||||
linux.run_command(command, check=True)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
|
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
# Deskflow -- mouse and keyboard sharing utility
|
|
||||||
# Copyright (C) 2024 Symless Ltd.
|
|
||||||
#
|
|
||||||
# This package is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU General Public License
|
|
||||||
# found in the file LICENSE that should have accompanied this file.
|
|
||||||
#
|
|
||||||
# This package is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
import os, sys
|
|
||||||
import lib.cmd_utils as cmd_utils
|
|
||||||
import lib.env as env
|
|
||||||
|
|
||||||
build_dir = "build/meson"
|
|
||||||
|
|
||||||
|
|
||||||
def meson_venv_bin():
|
|
||||||
if not env.in_venv():
|
|
||||||
raise RuntimeError("Not in a virtual environment")
|
|
||||||
|
|
||||||
return os.path.join(os.path.dirname(sys.executable), "meson")
|
|
||||||
|
|
||||||
|
|
||||||
def setup(no_system_list, static_list):
|
|
||||||
cmd = [meson_venv_bin(), "setup", build_dir]
|
|
||||||
|
|
||||||
for subproject in no_system_list or []:
|
|
||||||
cmd.append(f"-Dsystem-{subproject}=false")
|
|
||||||
|
|
||||||
# This might be a bit rude, but Meson seems to cache a lot (like CMake),
|
|
||||||
# so wiping every time is the easiest way to ensure that the build is clean.
|
|
||||||
# Plus, the way we're using Meson (at the moment) is just for satisfying
|
|
||||||
# dependencies, so this script is run infrequently enough to not matter.
|
|
||||||
if os.path.exists(build_dir):
|
|
||||||
cmd.append("--wipe")
|
|
||||||
|
|
||||||
cmd_utils.run(cmd, print_cmd=True)
|
|
||||||
|
|
||||||
for subproject in static_list or []:
|
|
||||||
static_subproject(subproject)
|
|
||||||
|
|
||||||
|
|
||||||
def static_subproject(subproject):
|
|
||||||
if subproject == "libportal":
|
|
||||||
# HACK: This is a bit horrible. Ideally, Meson would take care of applying this patch,
|
|
||||||
# but it only seems to copy the .diff over and not apply the patch.
|
|
||||||
#
|
|
||||||
# Important: Static linking is not intended for package maintainers, only for beta testers.
|
|
||||||
# Static linking is also pretty horrible, but many distros will be slow to pick up 0.8.x
|
|
||||||
# which has input capture support. The sooner we can remove this patching code the better.
|
|
||||||
cmd_utils.run(
|
|
||||||
[
|
|
||||||
"patch",
|
|
||||||
"-d",
|
|
||||||
"subprojects/libportal",
|
|
||||||
"-p1",
|
|
||||||
"-i",
|
|
||||||
"static-lib.diff",
|
|
||||||
],
|
|
||||||
print_cmd=True,
|
|
||||||
check=False,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
raise RuntimeError(f"Unknown subproject: {subproject}")
|
|
||||||
|
|
||||||
|
|
||||||
def compile():
|
|
||||||
cmd_utils.run([meson_venv_bin(), "compile", "-C", build_dir], print_cmd=True)
|
|
||||||
|
|
||||||
|
|
||||||
def install():
|
|
||||||
cmd = [meson_venv_bin(), "install", "-C", build_dir]
|
|
||||||
|
|
||||||
has_sudo = cmd_utils.has_command("sudo")
|
|
||||||
if has_sudo:
|
|
||||||
cmd.insert(0, "sudo")
|
|
||||||
|
|
||||||
cmd_utils.run(cmd, print_cmd=True)
|
|
||||||
|
|
@ -542,13 +542,9 @@ void MainWindow::open()
|
||||||
|
|
||||||
void MainWindow::onCoreProcessStarting()
|
void MainWindow::onCoreProcessStarting()
|
||||||
{
|
{
|
||||||
|
|
||||||
#if defined(WINAPI_XWINDOWS) or defined(WINAPI_LIBEI)
|
|
||||||
if (deskflow::platform::isWayland()) {
|
if (deskflow::platform::isWayland()) {
|
||||||
m_WaylandWarnings.showOnce(this, m_CoreProcess.mode());
|
m_WaylandWarnings.showOnce(this, m_CoreProcess.mode());
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
saveSettings();
|
saveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -188,13 +188,4 @@
|
||||||
/* Define to `unsigned int` if <sys/types.h> does not define. */
|
/* Define to `unsigned int` if <sys/types.h> does not define. */
|
||||||
#cmakedefine size_t @size_t@
|
#cmakedefine size_t @size_t@
|
||||||
|
|
||||||
/* Define if libportal has xdp_session_connect_to_eis */
|
|
||||||
#cmakedefine HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS @HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS@
|
|
||||||
|
|
||||||
/* Define if libportal has xdp_portal_create_remote_desktop_session_full */
|
|
||||||
#cmakedefine HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL @HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL@
|
|
||||||
|
|
||||||
/* Define if libportal has input capture support */
|
|
||||||
#cmakedefine HAVE_LIBPORTAL_INPUTCAPTURE @HAVE_LIBPORTAL_INPUTCAPTURE@
|
|
||||||
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ add_library(${target} STATIC ${sources} ${ui_files} ${qrc_file})
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
${target}
|
${target}
|
||||||
${DESKFLOW_GUI_HOOK_LIB}
|
${DESKFLOW_GUI_HOOK_LIB}
|
||||||
|
platform
|
||||||
Qt6::Core
|
Qt6::Core
|
||||||
Qt6::Widgets
|
Qt6::Widgets
|
||||||
Qt6::Network)
|
Qt6::Network)
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,13 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
if(UNIX AND NOT APPLE)
|
||||||
|
pkg_check_modules(LIBEI REQUIRED QUIET "libei-1.0 >= 1.3")
|
||||||
|
message(STATUS "libei version: ${LIBEI_VERSION}")
|
||||||
|
|
||||||
|
pkg_check_modules(LIBPORTAL REQUIRED QUIET "libportal >= 0.8")
|
||||||
|
message(STATUS "libportal version: ${LIBPORTAL_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
file(GLOB headers "MSWindows*.h")
|
file(GLOB headers "MSWindows*.h")
|
||||||
|
|
@ -68,16 +75,15 @@ add_library(platform STATIC ${sources})
|
||||||
target_link_libraries(platform client ${libs})
|
target_link_libraries(platform client ${libs})
|
||||||
|
|
||||||
macro(link_wayland_libs)
|
macro(link_wayland_libs)
|
||||||
|
target_compile_definitions(platform PUBLIC WINAPI_LIBEI WINAPI_LIBPORTAL HAVE_LIBPORTAL_INPUTCAPTURE)
|
||||||
|
|
||||||
target_link_libraries(platform ${LIBXKBCOMMON_LINK_LIBRARIES}
|
target_link_libraries(platform ${LIBXKBCOMMON_LINK_LIBRARIES}
|
||||||
${GLIB2_LINK_LIBRARIES} ${LIBM_LIBRARIES})
|
${GLIB2_LINK_LIBRARIES} ${LIBM_LIBRARIES}
|
||||||
|
${LIBEI_LINK_LIBRARIES} ${LIBPORTAL_LINK_LIBRARIES}
|
||||||
|
)
|
||||||
|
|
||||||
if(LIBEI_FOUND)
|
target_include_directories(platform PUBLIC ${LIBEI_INCLUDE_DIRS} ${LIBPORTAL_INCLUDE_DIRS})
|
||||||
target_link_libraries(platform ${LIBEI_LINK_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(LIBPORTAL_FOUND)
|
|
||||||
target_link_libraries(platform ${LIBPORTAL_LINK_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
if(UNIX)
|
if(UNIX)
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "base/IEventQueueBuffer.h"
|
#include "base/IEventQueueBuffer.h"
|
||||||
#include "deskflow/IScreen.h"
|
#include "deskflow/IScreen.h"
|
||||||
#include "mt/Thread.h"
|
#include "mt/Thread.h"
|
||||||
|
|
|
||||||
|
|
@ -29,11 +29,8 @@
|
||||||
#include "deskflow/XScreen.h"
|
#include "deskflow/XScreen.h"
|
||||||
#include "platform/EiEventQueueBuffer.h"
|
#include "platform/EiEventQueueBuffer.h"
|
||||||
#include "platform/EiKeyState.h"
|
#include "platform/EiKeyState.h"
|
||||||
|
|
||||||
#if WINAPI_LIBPORTAL
|
|
||||||
#include "platform/PortalInputCapture.h"
|
#include "platform/PortalInputCapture.h"
|
||||||
#include "platform/PortalRemoteDesktop.h"
|
#include "platform/PortalRemoteDesktop.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
@ -70,21 +67,13 @@ EiScreen::EiScreen(bool is_primary, IEventQueue *events, bool use_portal)
|
||||||
new TMethodEventJob<EiScreen>(this, &EiScreen::handle_connected_to_eis_event)
|
new TMethodEventJob<EiScreen>(this, &EiScreen::handle_connected_to_eis_event)
|
||||||
);
|
);
|
||||||
if (is_primary) {
|
if (is_primary) {
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
portal_input_capture_ = new PortalInputCapture(this, events_);
|
portal_input_capture_ = new PortalInputCapture(this, events_);
|
||||||
#else
|
|
||||||
throw std::invalid_argument("missing libportal input capture support");
|
|
||||||
#endif // HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
} else {
|
} else {
|
||||||
#if WINAPI_LIBPORTAL
|
|
||||||
events_->adoptHandler(
|
events_->adoptHandler(
|
||||||
events_->forEi().sessionClosed(), getEventTarget(),
|
events_->forEi().sessionClosed(), getEventTarget(),
|
||||||
new TMethodEventJob<EiScreen>(this, &EiScreen::handle_portal_session_closed)
|
new TMethodEventJob<EiScreen>(this, &EiScreen::handle_portal_session_closed)
|
||||||
);
|
);
|
||||||
portal_remote_desktop_ = new PortalRemoteDesktop(this, events_);
|
portal_remote_desktop_ = new PortalRemoteDesktop(this, events_);
|
||||||
#else
|
|
||||||
throw std::invalid_argument("missing libportal remote desktop support");
|
|
||||||
#endif // WINAPI_LIBPORTAL
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Note: socket backend does not support reconnections
|
// Note: socket backend does not support reconnections
|
||||||
|
|
@ -105,12 +94,8 @@ EiScreen::~EiScreen()
|
||||||
|
|
||||||
delete key_state_;
|
delete key_state_;
|
||||||
|
|
||||||
#if WINAPI_LIBPORTAL
|
|
||||||
delete portal_remote_desktop_;
|
delete portal_remote_desktop_;
|
||||||
#endif
|
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
delete portal_input_capture_;
|
delete portal_input_capture_;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EiScreen::handle_ei_log_event(ei *ei, ei_log_priority priority, const char *message, ei_log_context *context)
|
void EiScreen::handle_ei_log_event(ei *ei, ei_log_priority priority, const char *message, ei_log_context *context)
|
||||||
|
|
@ -365,13 +350,10 @@ void EiScreen::enter()
|
||||||
ei_device_start_emulating(ei_abs_, sequence_number_);
|
ei_device_start_emulating(ei_abs_, sequence_number_);
|
||||||
fakeMouseMove(cursor_x_, cursor_y_);
|
fakeMouseMove(cursor_x_, cursor_y_);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
else {
|
|
||||||
LOG_DEBUG("releasing input capture at x=%i y=%i", cursor_x_, cursor_y_);
|
LOG_DEBUG("releasing input capture at x=%i y=%i", cursor_x_, cursor_y_);
|
||||||
portal_input_capture_->release(cursor_x_, cursor_y_);
|
portal_input_capture_->release(cursor_x_, cursor_y_);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EiScreen::canLeave()
|
bool EiScreen::canLeave()
|
||||||
|
|
@ -699,12 +681,9 @@ void EiScreen::on_motion_event(ei_event *event)
|
||||||
if (is_on_screen_) {
|
if (is_on_screen_) {
|
||||||
LOG_DEBUG("event: motion on primary x=%i y=%i)", cursor_x_, cursor_y_);
|
LOG_DEBUG("event: motion on primary x=%i y=%i)", cursor_x_, cursor_y_);
|
||||||
sendEvent(events_->forIPrimaryScreen().motionOnPrimary(), MotionInfo::alloc(cursor_x_, cursor_y_));
|
sendEvent(events_->forIPrimaryScreen().motionOnPrimary(), MotionInfo::alloc(cursor_x_, cursor_y_));
|
||||||
|
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
if (portal_input_capture_->is_active()) {
|
if (portal_input_capture_->is_active()) {
|
||||||
portal_input_capture_->release();
|
portal_input_capture_->release();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
} else {
|
} else {
|
||||||
buffer_dx += dx;
|
buffer_dx += dx;
|
||||||
buffer_dy += dy;
|
buffer_dy += dy;
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "deskflow/KeyMap.h"
|
#include "deskflow/KeyMap.h"
|
||||||
#include "deskflow/PlatformScreen.h"
|
#include "deskflow/PlatformScreen.h"
|
||||||
|
|
||||||
|
|
@ -37,9 +36,7 @@ namespace deskflow {
|
||||||
class EiClipboard;
|
class EiClipboard;
|
||||||
class EiKeyState;
|
class EiKeyState;
|
||||||
class PortalRemoteDesktop;
|
class PortalRemoteDesktop;
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
class PortalInputCapture;
|
class PortalInputCapture;
|
||||||
#endif
|
|
||||||
|
|
||||||
//! Implementation of IPlatformScreen for X11
|
//! Implementation of IPlatformScreen for X11
|
||||||
class EiScreen : public PlatformScreen
|
class EiScreen : public PlatformScreen
|
||||||
|
|
@ -159,9 +156,7 @@ private:
|
||||||
mutable std::mutex mutex_;
|
mutable std::mutex mutex_;
|
||||||
|
|
||||||
PortalRemoteDesktop *portal_remote_desktop_ = nullptr;
|
PortalRemoteDesktop *portal_remote_desktop_ = nullptr;
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
PortalInputCapture *portal_input_capture_ = nullptr;
|
PortalInputCapture *portal_input_capture_ = nullptr;
|
||||||
#endif
|
|
||||||
|
|
||||||
struct HotKeyItem
|
struct HotKeyItem
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,14 +16,10 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "platform/PortalInputCapture.h"
|
||||||
|
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
|
|
||||||
#include "base/Event.h"
|
#include "base/Event.h"
|
||||||
#include "base/Log.h"
|
#include "base/Log.h"
|
||||||
#include "base/TMethodJob.h"
|
#include "base/TMethodJob.h"
|
||||||
#include "platform/PortalInputCapture.h"
|
|
||||||
|
|
||||||
#include <sys/socket.h> // for EIS fd hack, remove
|
#include <sys/socket.h> // for EIS fd hack, remove
|
||||||
#include <sys/un.h> // for EIS fd hack, remove
|
#include <sys/un.h> // for EIS fd hack, remove
|
||||||
|
|
@ -395,5 +391,3 @@ void PortalInputCapture::glib_thread(void *)
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace deskflow
|
} // namespace deskflow
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
||||||
|
|
@ -18,10 +18,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#if HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
|
|
||||||
#include "mt/Thread.h"
|
#include "mt/Thread.h"
|
||||||
#include "platform/EiScreen.h"
|
#include "platform/EiScreen.h"
|
||||||
|
|
||||||
|
|
@ -104,5 +100,3 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace deskflow
|
} // namespace deskflow
|
||||||
|
|
||||||
#endif // HAVE_LIBPORTAL_INPUTCAPTURE
|
|
||||||
|
|
|
||||||
|
|
@ -108,9 +108,7 @@ void PortalRemoteDesktop::cb_session_started(GObject *object, GAsyncResult *res)
|
||||||
// version in the impl.portal), i.e. you'll need an updated compositor on
|
// version in the impl.portal), i.e. you'll need an updated compositor on
|
||||||
// top of everything...
|
// top of everything...
|
||||||
auto fd = -1;
|
auto fd = -1;
|
||||||
#if HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS
|
|
||||||
fd = xdp_session_connect_to_eis(session, &error);
|
fd = xdp_session_connect_to_eis(session, &error);
|
||||||
#endif
|
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
g_main_loop_quit(glib_main_loop_);
|
g_main_loop_quit(glib_main_loop_);
|
||||||
events_->addEvent(Event::kQuit);
|
events_->addEvent(Event::kQuit);
|
||||||
|
|
@ -159,17 +157,6 @@ void PortalRemoteDesktop::cb_init_remote_desktop_session(GObject *object, GAsync
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL)
|
|
||||||
static inline void xdp_portal_create_remote_desktop_session_full(
|
|
||||||
XdpPortal *portal, XdpDeviceType devices, XdpOutputType outputs, XdpRemoteDesktopFlags flags,
|
|
||||||
XdpCursorMode cursor_mode, XdpPersistMode _unused1, const char *_unused2, GCancellable *cancellable,
|
|
||||||
GAsyncReadyCallback callback, gpointer data
|
|
||||||
)
|
|
||||||
{
|
|
||||||
xdp_portal_create_remote_desktop_session(portal, devices, outputs, flags, cursor_mode, cancellable, callback, data);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gboolean PortalRemoteDesktop::init_remote_desktop_session()
|
gboolean PortalRemoteDesktop::init_remote_desktop_session()
|
||||||
{
|
{
|
||||||
LOG_DEBUG("setting up remote desktop session with restore token %s", session_restore_token_);
|
LOG_DEBUG("setting up remote desktop session with restore token %s", session_restore_token_);
|
||||||
|
|
|
||||||
|
|
@ -18,20 +18,12 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "mt/Thread.h"
|
#include "mt/Thread.h"
|
||||||
#include "platform/EiScreen.h"
|
#include "platform/EiScreen.h"
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <libportal/portal.h>
|
#include <libportal/portal.h>
|
||||||
|
|
||||||
#if !HAVE_LIBPORTAL_OUTPUT_NONE
|
|
||||||
// Added in libportal ad82a74 Jun 2022, not yet released in libportal 0.6
|
|
||||||
// should be used as a patch on ≤ 0.6, and non-git
|
|
||||||
#define XDP_OUTPUT_NONE (XdpOutputType)0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace deskflow {
|
namespace deskflow {
|
||||||
|
|
||||||
class PortalRemoteDesktop
|
class PortalRemoteDesktop
|
||||||
|
|
|
||||||
11
subprojects/.gitignore
vendored
11
subprojects/.gitignore
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
# Ignore all files in the subprojects directory.
|
|
||||||
*
|
|
||||||
|
|
||||||
# Except for the wrap files.
|
|
||||||
!.gitignore
|
|
||||||
!*.wrap
|
|
||||||
!packagefiles/*
|
|
||||||
|
|
||||||
# Ignore wraps added by subprojects.
|
|
||||||
gi-docgen.wrap
|
|
||||||
munit.wrap
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
[wrap-git]
|
|
||||||
url = https://gitlab.freedesktop.org/libinput/libei.git
|
|
||||||
revision = main
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
[wrap-git]
|
|
||||||
url = https://github.com/flatpak/libportal.git
|
|
||||||
revision = main
|
|
||||||
patch_directory = libportal
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
diff --git a/libportal/meson.build b/libportal/meson.build
|
|
||||||
index 316bd9c..37a17f7 100644
|
|
||||||
--- a/libportal/meson.build
|
|
||||||
+++ b/libportal/meson.build
|
|
||||||
@@ -73,9 +73,8 @@ gio_unix_dep = dependency('gio-unix-2.0')
|
|
||||||
|
|
||||||
install_headers(headers, subdir: 'libportal')
|
|
||||||
|
|
||||||
-libportal = library('portal',
|
|
||||||
+libportal = static_library('portal',
|
|
||||||
src,
|
|
||||||
- version: version,
|
|
||||||
include_directories: [top_inc, libportal_inc],
|
|
||||||
install: true,
|
|
||||||
dependencies: [gio_dep, gio_unix_dep],
|
|
||||||
Loading…
Reference in a new issue