diff --git a/.github/workflows/pre-release.yml b/.github/workflows/pre-release.yml index a99ed55..bb4b901 100644 --- a/.github/workflows/pre-release.yml +++ b/.github/workflows/pre-release.yml @@ -30,14 +30,50 @@ jobs: windows-release-build: runs-on: windows-latest steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + # needed for cache restore + - name: create gtk dir + run: mkdir C:\gtk-build\gtk\x64\release + - uses: actions/cache@v3 + id: cache + with: + path: c:/gtk-build/gtk/x64/release/** + key: gtk-windows-build + restore-keys: gtk-windows-build + - name: Update path + run: | + echo "PKG_CONFIG=C:\gtk-build\gtk\x64\release\bin\pkgconf.exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "C:\pkg-config-lite-0.28-1\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo "C:\gtk-build\gtk\x64\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo $env:GITHUB_PATH + echo $env:PATH + - name: Install dependencies + if: steps.cache.outputs.cache-hit != 'true' + run: | + # choco install msys2 + # choco install visualstudio2022-workload-vctools + # choco install pkgconfiglite + pipx install gvsbuild + # see https://github.com/wingtk/gvsbuild/pull/1004 + Move-Item "C:\Program Files\Git\usr\bin" "C:\Program Files\Git\usr\notbin" + Move-Item "C:\Program Files\Git\bin" "C:\Program Files\Git\notbin" + gvsbuild build --msys-dir=C:\msys64 gtk4 libadwaita librsvg + Move-Item "C:\Program Files\Git\usr\notbin" "C:\Program Files\Git\usr\bin" + Move-Item "C:\Program Files\Git\notbin" "C:\Program Files\Git\bin" - uses: actions/checkout@v3 - name: Release Build run: cargo build --release + - name: Copy Gtk Dlls + run: Get-Childitem -Path "C:\\gtk-build\\gtk\\x64\\release\\bin\\*.dll" -File -Recurse | Copy-Item -Destination "target\\release" - name: Upload build artifact uses: actions/upload-artifact@v3 with: name: lan-mouse-windows - path: target/release/lan-mouse.exe + path: | + target/release/lan-mouse.exe + target/release/*.dll macos-release-build: runs-on: macos-latest diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 62f99dc..b5c1292 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -41,6 +41,38 @@ jobs: steps: - uses: actions/checkout@v3 + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + # needed for cache restore + - name: create gtk dir + run: mkdir C:\gtk-build\gtk\x64\release + - uses: actions/cache@v3 + id: cache + with: + path: c:/gtk-build/gtk/x64/release/** + key: gtk-windows-build + restore-keys: gtk-windows-build + - name: Update path + run: | + echo "PKG_CONFIG=C:\gtk-build\gtk\x64\release\bin\pkgconf.exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "C:\pkg-config-lite-0.28-1\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo "C:\gtk-build\gtk\x64\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo $env:GITHUB_PATH + echo $env:PATH + - name: Install dependencies + if: steps.cache.outputs.cache-hit != 'true' + run: | + # choco install msys2 + # choco install visualstudio2022-workload-vctools + # choco install pkgconfiglite + pipx install gvsbuild + # see https://github.com/wingtk/gvsbuild/pull/1004 + Move-Item "C:\Program Files\Git\usr\bin" "C:\Program Files\Git\usr\notbin" + Move-Item "C:\Program Files\Git\bin" "C:\Program Files\Git\notbin" + gvsbuild build --msys-dir=C:\msys64 gtk4 libadwaita librsvg + Move-Item "C:\Program Files\Git\usr\notbin" "C:\Program Files\Git\usr\bin" + Move-Item "C:\Program Files\Git\notbin" "C:\Program Files\Git\bin" - name: Build run: cargo build --verbose - name: Run tests @@ -49,11 +81,15 @@ jobs: run: cargo fmt --check - name: Clippy run: cargo clippy --all-features --all-targets -- --deny warnings + - name: Copy Gtk Dlls + run: Get-Childitem -Path "C:\\gtk-build\\gtk\\x64\\release\\bin\\*.dll" -File -Recurse | Copy-Item -Destination "target\\debug" - name: Upload build artifact uses: actions/upload-artifact@v3 with: name: lan-mouse-windows - path: target/debug/lan-mouse.exe + path: | + target/debug/lan-mouse.exe + target/debug/*.dll build-macos: runs-on: macos-latest diff --git a/.github/workflows/tagged-release.yml b/.github/workflows/tagged-release.yml index 38063a5..5f13499 100644 --- a/.github/workflows/tagged-release.yml +++ b/.github/workflows/tagged-release.yml @@ -26,14 +26,50 @@ jobs: windows-release-build: runs-on: windows-latest steps: + - uses: actions/setup-python@v5 + with: + python-version: '3.11' + # needed for cache restore + - name: create gtk dir + run: mkdir C:\gtk-build\gtk\x64\release + - uses: actions/cache@v3 + id: cache + with: + path: c:/gtk-build/gtk/x64/release/** + key: gtk-windows-build + restore-keys: gtk-windows-build + - name: Update path + run: | + echo "PKG_CONFIG=C:\gtk-build\gtk\x64\release\bin\pkgconf.exe" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append + echo "C:\pkg-config-lite-0.28-1\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo "C:\gtk-build\gtk\x64\release\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + echo $env:GITHUB_PATH + echo $env:PATH + - name: Install dependencies + if: steps.cache.outputs.cache-hit != 'true' + run: | + # choco install msys2 + # choco install visualstudio2022-workload-vctools + # choco install pkgconfiglite + pipx install gvsbuild + # see https://github.com/wingtk/gvsbuild/pull/1004 + Move-Item "C:\Program Files\Git\usr\bin" "C:\Program Files\Git\usr\notbin" + Move-Item "C:\Program Files\Git\bin" "C:\Program Files\Git\notbin" + gvsbuild build --msys-dir=C:\msys64 gtk4 libadwaita librsvg + Move-Item "C:\Program Files\Git\usr\notbin" "C:\Program Files\Git\usr\bin" + Move-Item "C:\Program Files\Git\notbin" "C:\Program Files\Git\bin" - uses: actions/checkout@v3 - name: Release Build run: cargo build --release + - name: Copy Gtk Dlls + run: Get-Childitem -Path "C:\\gtk-build\\gtk\\x64\\release\\bin\\*.dll" -File -Recurse | Copy-Item -Destination "target\\release" - name: Upload build artifact uses: actions/upload-artifact@v3 with: name: lan-mouse-windows - path: target/release/lan-mouse.exe + path: | + target/release/lan-mouse.exe + target/release/*.dll macos-release-build: runs-on: macos-latest diff --git a/Cargo.toml b/Cargo.toml index d788966..a328b71 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,9 @@ async-trait = "0.1.73" futures-core = "0.3.28" futures = "0.3.28" clap = { version="4.4.11", features = ["derive"] } +gtk = { package = "gtk4", version = "0.7.2", features = ["v4_2"], optional = true } +adw = { package = "libadwaita", version = "0.5.2", features = ["v1_1"], optional = true } +async-channel = { version = "2.1.1", optional = true } [target.'cfg(all(unix, not(target_os="macos")))'.dependencies] wayland-client = { version="0.31.1", optional = true } @@ -38,18 +41,13 @@ ashpd = { version = "0.6.2", default-features = false, features = ["tokio"], opt reis = { git = "https://github.com/ids1024/reis", features = [ "tokio" ], optional = true } libc = { version="0.2.148", optional = true } -[target.'cfg(unix)'.dependencies] -gtk = { package = "gtk4", version = "0.7.2", features = ["v4_6"], optional = true } -adw = { package = "libadwaita", version = "0.5.2", features = ["v1_1"], optional = true } -async-channel = { version = "2.1.1", optional = true } - [target.'cfg(target_os="macos")'.dependencies] core-graphics = { version = "0.23", features = ["highsierra"] } [target.'cfg(windows)'.dependencies] winapi = { version = "0.3.9", features = ["winuser"] } -[target.'cfg(unix)'.build-dependencies] +[build-dependencies] glib-build-tools = "0.18.0" [features] diff --git a/README.md b/README.md index 0088c74..465f6cd 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,72 @@ input capture (to send events *to* other clients) on different operating systems Keycode translation is not yet implemented so on MacOS only mouse emulation works as of right now. ## Build and Run + +### Install Dependencies +#### Macos +```sh +brew install libadwaita +``` + +#### Ubuntu and derivatives +```sh +sudo apt install libadwaita-1-dev libgtk-4-dev libx11-dev libxtst-dev +``` + +#### Arch and derivatives +```sh +sudo pacman -S libadwaita gtk libx11 libxtst +``` + +#### Fedora and derivatives +```sh +sudo dnf install libadwaita-devel libXtst-devel libX11-devel +``` + +#### Windows +Follow the instructions at [gtk-rs.org](https://gtk-rs.org/gtk4-rs/stable/latest/book/installation_windows.html) + +*TLDR:* + +Build gtk from source + +- The following commands should be run in an admin power shell instance: +```sh +# install chocolatey +Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + +# install python 3.11 (Version is important, as 3.12 does not work currently) +choco install python --version=3.11.0 + +# install git +choco install git + +# install msys2 +choco install msys2 + +# install Visual Studio 2022 +choco install visualstudio2022-workload-vctools +``` + +- The following commands should be run in a regular power shell instance: + +```sh +# install gvsbuild with python +python -m pip install --user pipx +python -m pipx ensurepath +pipx install gvsbuild + +# build gtk + libadwaita +gvsbuild build gtk4 libadwaita librsvg +``` + +Make sure to add the directory `C:\gtk-build\gtk\x64\release\bin` +[to the `PATH` environment variable]((https://learn.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ee537574(v=office.14))). Otherwise the project will fail to build. + +To avoid building GTK from source, it is possible to disable +the gtk frontend (see conditional compilation below). + +### Build and run Build in release mode: ```sh cargo build --release diff --git a/build.rs b/build.rs index 03bb139..bf1a701 100644 --- a/build.rs +++ b/build.rs @@ -1,6 +1,5 @@ fn main() { // composite_templates - #[cfg(unix)] glib_build_tools::compile_resources( &["resources"], "resources/resources.gresource.xml", diff --git a/src/config.rs b/src/config.rs index 767a133..dda3561 100644 --- a/src/config.rs +++ b/src/config.rs @@ -109,9 +109,9 @@ impl Config { }; let frontend = match frontend { - #[cfg(all(unix, feature = "gtk"))] + #[cfg(feature = "gtk")] None => Frontend::Gtk, - #[cfg(any(not(feature = "gtk"), not(unix)))] + #[cfg(not(feature = "gtk"))] None => Frontend::Cli, Some(s) => match s.as_str() { "cli" => Frontend::Cli, diff --git a/src/frontend.rs b/src/frontend.rs index de93a5d..208faac 100644 --- a/src/frontend.rs +++ b/src/frontend.rs @@ -31,16 +31,16 @@ use crate::{ pub mod cli; /// gtk frontend -#[cfg(all(unix, feature = "gtk"))] +#[cfg(feature = "gtk")] pub mod gtk; pub fn run_frontend(config: &Config) -> Result<()> { match config.frontend { - #[cfg(all(unix, feature = "gtk"))] + #[cfg(feature = "gtk")] Frontend::Gtk => { gtk::run(); } - #[cfg(any(not(feature = "gtk"), not(unix)))] + #[cfg(not(feature = "gtk"))] Frontend::Gtk => panic!("gtk frontend requested but feature not enabled!"), Frontend::Cli => { cli::run()?; diff --git a/src/frontend/gtk.rs b/src/frontend/gtk.rs index e75c9b2..7f78bf4 100644 --- a/src/frontend/gtk.rs +++ b/src/frontend/gtk.rs @@ -27,7 +27,17 @@ use super::FrontendNotify; pub fn run() -> glib::ExitCode { log::debug!("running gtk frontend"); + #[cfg(windows)] + let ret = std::thread::Builder::new() + .stack_size(8 * 1024 * 1024) // https://gitlab.gnome.org/GNOME/gtk/-/commit/52dbb3f372b2c3ea339e879689c1de535ba2c2c3 -> caused crash on windows + .name("gtk".into()) + .spawn(gtk_main) + .unwrap() + .join() + .unwrap(); + #[cfg(not(windows))] let ret = gtk_main(); + log::debug!("frontend exited"); ret } diff --git a/src/frontend/gtk/window/imp.rs b/src/frontend/gtk/window/imp.rs index ae328de..dce24af 100644 --- a/src/frontend/gtk/window/imp.rs +++ b/src/frontend/gtk/window/imp.rs @@ -1,7 +1,9 @@ -use std::{ - cell::{Cell, RefCell}, - os::unix::net::UnixStream, -}; +use std::cell::{Cell, RefCell}; + +#[cfg(windows)] +use std::net::TcpStream; +#[cfg(unix)] +use std::os::unix::net::UnixStream; use adw::subclass::prelude::*; use adw::{ @@ -29,7 +31,10 @@ pub struct Window { #[template_child] pub toast_overlay: TemplateChild, pub clients: RefCell>, + #[cfg(unix)] pub stream: RefCell>, + #[cfg(windows)] + pub stream: RefCell>, pub port: Cell, } diff --git a/src/main.rs b/src/main.rs index fef1e63..8561654 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,8 +36,10 @@ pub fn run() -> Result<()> { } else { // otherwise start the service as a child process and // run a frontend - start_service()?; + let mut service = start_service()?; frontend::run_frontend(&config)?; + log::info!("terminating service"); + service.kill()?; } anyhow::Ok(())