mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-09-17 09:51:08 +03:00
Compare commits
2 Commits
main-09889
...
main-00c5e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
00c5eee8d8 | ||
|
|
6b1eddef7a |
14
flake.lock
generated
14
flake.lock
generated
@@ -2,16 +2,16 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1772963539,
|
"lastModified": 1788405554,
|
||||||
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
|
"narHash": "sha256-r2f1oUwixlgq9zOdYLqJLfS/lWBT60/IITjhTKI59JU=",
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
|
"rev": "a5cc6f2c37bf518436dc8d1c288ccd0c43c2f4c4",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nixos",
|
"owner": "nixos",
|
||||||
"ref": "nixos-unstable",
|
"ref": "nixos-26.05",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
@@ -29,11 +29,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1773025773,
|
"lastModified": 1788505699,
|
||||||
"narHash": "sha256-Wik8+xApNfldpUFjPmJkPdg0RrvUPSWGIZis+A/0N1w=",
|
"narHash": "sha256-PSPDCdbEBEbSDCWcqv5GkbyD2ACQ9Diz6vmEbWdy4dM=",
|
||||||
"owner": "oxalica",
|
"owner": "oxalica",
|
||||||
"repo": "rust-overlay",
|
"repo": "rust-overlay",
|
||||||
"rev": "3c06fdbbd36ff60386a1e590ee0cd52dcd1892bf",
|
"rev": "9eccf73c5b810052f08aa77ae0548c383259f17f",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
24
flake.nix
24
flake.nix
@@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
description = "Nix Flake for lan-mouse";
|
description = "Nix Flake for lan-mouse";
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
# 26.05 used here to keep allowing builds on x86_64-darwin, bump this to unstable once they deprecate 26.05
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05";
|
||||||
rust-overlay = {
|
rust-overlay = {
|
||||||
url = "github:oxalica/rust-overlay";
|
url = "github:oxalica/rust-overlay";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@@ -30,7 +31,24 @@
|
|||||||
let
|
let
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
overlays = [ rust-overlay.overlays.default ];
|
overlays = [
|
||||||
|
rust-overlay.overlays.default
|
||||||
|
|
||||||
|
#NOTE: appstream's meson build injects the literal string
|
||||||
|
# "none required" into linker flags on 'aarch64-darwin', causing clang to fail.
|
||||||
|
# remove this overlay once we bump nixpkgs to unstable branch
|
||||||
|
(
|
||||||
|
final: prev:
|
||||||
|
lib.optionalAttrs prev.stdenv.hostPlatform.isDarwin {
|
||||||
|
appstream = prev.appstream.overrideAttrs (old: {
|
||||||
|
postConfigure = (old.postConfigure or "") + ''
|
||||||
|
substituteInPlace build.ninja \
|
||||||
|
--replace-fail "none required" ""
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
};
|
};
|
||||||
# Default toolchain for devshell
|
# Default toolchain for devshell
|
||||||
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
|
rustToolchain = pkgs.rust-bin.stable.latest.default.override {
|
||||||
@@ -80,7 +98,7 @@
|
|||||||
libadwaita
|
libadwaita
|
||||||
librsvg
|
librsvg
|
||||||
]
|
]
|
||||||
++ lib.optionals pkgs.stdenv.isLinux [
|
++ lib.optionals pkgs.stdenv.hostPlatform.isLinux [
|
||||||
libX11
|
libX11
|
||||||
libXtst
|
libXtst
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -18,12 +18,12 @@ use reis::{
|
|||||||
use std::{
|
use std::{
|
||||||
cell::Cell,
|
cell::Cell,
|
||||||
collections::HashMap,
|
collections::HashMap,
|
||||||
io,
|
env, io,
|
||||||
num::NonZeroU32,
|
num::NonZeroU32,
|
||||||
os::unix::net::UnixStream,
|
os::unix::net::UnixStream,
|
||||||
pin::Pin,
|
pin::Pin,
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
sync::Arc,
|
sync::{Arc, LazyLock},
|
||||||
task::{Context, Poll},
|
task::{Context, Poll},
|
||||||
};
|
};
|
||||||
use tokio::{
|
use tokio::{
|
||||||
@@ -50,6 +50,25 @@ use super::{
|
|||||||
* prevents receiving further events after a session has been disabled once.
|
* prevents receiving further events after a session has been disabled once.
|
||||||
* Therefore the session needs to be recreated when the barriers are updated */
|
* Therefore the session needs to be recreated when the barriers are updated */
|
||||||
|
|
||||||
|
/* mutter also kills the session whenever ei devices come and go, so there the
|
||||||
|
* whole session has to be torn down and recreated on every device change.
|
||||||
|
* Elsewhere that is pure overhead: each restart costs a CreateSession +
|
||||||
|
* ConnectToEIS round trip, and compositors that keep per-session state around
|
||||||
|
* (hyprland leaks a keymap fd per eis session, see hyprwm/Hyprland) can be
|
||||||
|
* driven out of file descriptors by the churn.
|
||||||
|
* Set LM_RESTART_SESSION_ON_DEVICE_CHANGE=1/0 to override the default. */
|
||||||
|
static RESTART_SESSION_ON_DEVICE_CHANGE: LazyLock<bool> =
|
||||||
|
LazyLock::new(restart_session_on_device_change);
|
||||||
|
|
||||||
|
fn restart_session_on_device_change() -> bool {
|
||||||
|
match env::var("LM_RESTART_SESSION_ON_DEVICE_CHANGE").as_deref() {
|
||||||
|
Ok("1") => true,
|
||||||
|
Ok("0") => false,
|
||||||
|
_ => env::var("XDG_CURRENT_DESKTOP")
|
||||||
|
.is_ok_and(|desktops| desktops.to_uppercase().split(':').any(|d| d == "GNOME")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// events that necessitate restarting the capture session
|
/// events that necessitate restarting the capture session
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
enum LibeiNotifyEvent {
|
enum LibeiNotifyEvent {
|
||||||
@@ -555,20 +574,32 @@ async fn handle_ei_event(
|
|||||||
s.seat.bind_capabilities(all_capabilities);
|
s.seat.bind_capabilities(all_capabilities);
|
||||||
context.flush().map_err(|e| io::Error::new(e.kind(), e))?;
|
context.flush().map_err(|e| io::Error::new(e.kind(), e))?;
|
||||||
}
|
}
|
||||||
EiEvent::SeatRemoved(_) | /* EiEvent::DeviceAdded(_) | */ EiEvent::DeviceRemoved(_) => {
|
EiEvent::SeatRemoved(_) => {
|
||||||
log::debug!("releasing session: {ei_event:?}");
|
log::debug!("releasing session: {ei_event:?}");
|
||||||
release_session.notify_waiters();
|
release_session.notify_waiters();
|
||||||
}
|
}
|
||||||
|
/* EiEvent::DeviceAdded(_) | */
|
||||||
|
EiEvent::DeviceRemoved(_) => {
|
||||||
|
if *RESTART_SESSION_ON_DEVICE_CHANGE {
|
||||||
|
log::debug!("releasing session: {ei_event:?}");
|
||||||
|
release_session.notify_waiters();
|
||||||
|
} else {
|
||||||
|
log::debug!("ignoring device change: {ei_event:?}");
|
||||||
|
}
|
||||||
|
}
|
||||||
EiEvent::DevicePaused(_) | EiEvent::DeviceResumed(_) => {}
|
EiEvent::DevicePaused(_) | EiEvent::DeviceResumed(_) => {}
|
||||||
EiEvent::DeviceStartEmulating(_) => log::debug!("START EMULATING"),
|
EiEvent::DeviceStartEmulating(_) => log::debug!("START EMULATING"),
|
||||||
EiEvent::DeviceStopEmulating(_) => log::debug!("STOP EMULATING"),
|
EiEvent::DeviceStopEmulating(_) => log::debug!("STOP EMULATING"),
|
||||||
EiEvent::Disconnected(d) => {
|
EiEvent::Disconnected(d) => {
|
||||||
return Err(CaptureError::Disconnected(format!("{:?}", d.reason)))
|
return Err(CaptureError::Disconnected(format!("{:?}", d.reason)));
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
if let Some(pos) = current_client {
|
if let Some(pos) = current_client {
|
||||||
for event in Event::from_ei_event(ei_event) {
|
for event in Event::from_ei_event(ei_event) {
|
||||||
event_tx.send((pos, CaptureEvent::Input(event))).await.expect("no channel");
|
event_tx
|
||||||
|
.send((pos, CaptureEvent::Input(event)))
|
||||||
|
.await
|
||||||
|
.expect("no channel");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ rustPlatform.buildRustPackage {
|
|||||||
libadwaita
|
libadwaita
|
||||||
librsvg
|
librsvg
|
||||||
]
|
]
|
||||||
++ lib.optionals stdenv.isLinux [
|
++ lib.optionals stdenv.hostPlatform.isLinux [
|
||||||
libX11
|
libX11
|
||||||
libXtst
|
libXtst
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ in {
|
|||||||
};
|
};
|
||||||
systemd = mkOption {
|
systemd = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = pkgs.stdenv.isLinux;
|
default = pkgs.stdenv.hostPlatform.isLinux;
|
||||||
description = "Whether to enable to systemd service for lan-mouse on linux.";
|
description = "Whether to enable to systemd service for lan-mouse on linux.";
|
||||||
};
|
};
|
||||||
launchd = mkOption {
|
launchd = mkOption {
|
||||||
type = types.bool;
|
type = types.bool;
|
||||||
default = pkgs.stdenv.isDarwin;
|
default = pkgs.stdenv.hostPlatform.isDarwin;
|
||||||
description = "Whether to enable to launchd service for lan-mouse on macOS.";
|
description = "Whether to enable to launchd service for lan-mouse on macOS.";
|
||||||
};
|
};
|
||||||
settings = lib.mkOption {
|
settings = lib.mkOption {
|
||||||
|
|||||||
Reference in New Issue
Block a user