This commit is contained in:
Robin Appelman 2025-06-09 18:05:39 +02:00
commit d4ce62a42c
19 changed files with 2724 additions and 1988 deletions

1215
server/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -5,21 +5,19 @@ authors = ["Robin Appelman <robin@icewind.nl>"]
edition = "2021"
description = "shortcutd server"
license = "MIT OR Apache-2.0"
repository = "https://github.com/icewind1991/shortcutd"
repository = "https://codeberg.org/icewind/shortcutd"
[[bin]]
name = "shortcutd"
path = "src/server.rs"
[dependencies]
main_error = "0.1.0"
glob = "0.3.0"
evdev-shortcut = "0.1.4"
tokio = { version = "1.28.2", features = ["macros", "rt-multi-thread"] }
futures = "0.3.28"
zbus = { version = "3.13.1", features = ["tokio"], default-features = false }
tracing = "0.1.37"
tracing-subscriber = "0.3.17"
[dev-dependencies]
test-case = "3.1.0"
main_error = "0.1.2"
glob = "0.3.2"
evdev-shortcut = "0.1.5"
tokio = { version = "1.45.1", features = ["macros", "rt-multi-thread"] }
futures = "0.3.31"
zbus = { version = "5.7.1", features = ["tokio"], default-features = false }
zbus_macros = "5.7.1"
tracing = "0.1.41"
tracing-subscriber = "0.3.19"

View file

@ -3,9 +3,11 @@ use futures::stream::StreamExt;
use glob::GlobError;
use main_error::MainError;
use std::path::PathBuf;
use std::pin::pin;
use tracing::{error, info};
use zbus::export::futures_util::pin_mut;
use zbus::{dbus_interface, fdo, ConnectionBuilder, ObjectServer, SignalContext};
use zbus::conn::Builder;
use zbus::{fdo, object_server::SignalEmitter, ObjectServer};
use zbus_macros::interface;
struct Register {
listener: ShortcutListener,
@ -14,7 +16,7 @@ struct Register {
const MAX_BARE: usize = 3;
#[dbus_interface(name = "nl.icewind.shortcutd")]
#[interface(name = "nl.icewind.shortcutd")]
impl Register {
async fn register(
&mut self,
@ -48,10 +50,10 @@ impl Register {
struct ShortcutSignal;
#[dbus_interface(name = "nl.icewind.shortcutd")]
#[interface(name = "nl.icewind.shortcutd")]
impl ShortcutSignal {
#[dbus_interface(signal)]
async fn triggered(signal_ctxt: &SignalContext<'_>, pressed: bool) -> zbus::Result<()>;
#[zbus(signal)]
async fn triggered(signal_context: &SignalEmitter<'_>, pressed: bool) -> zbus::Result<()>;
}
#[tokio::main]
@ -61,13 +63,13 @@ async fn main() -> Result<(), MainError> {
glob::glob("/dev/input/by-id/*-kbd")?.collect::<Result<Vec<PathBuf>, GlobError>>()?;
let listener = ShortcutListener::new();
let shortcut_events = listener.listen(&devices)?;
let mut shortcut_events = pin!(listener.listen(&devices)?);
let bus = Register {
listener,
bare_count: 0,
};
let conn = ConnectionBuilder::system()
let conn = Builder::system()
.map_err(|e| {
error!(error = ?e, "error while connecting to dbus system socket");
e
@ -83,13 +85,12 @@ async fn main() -> Result<(), MainError> {
let server = conn.object_server();
pin_mut!(shortcut_events);
while let Some(event) = shortcut_events.next().await {
let event: ShortcutEvent = event;
let identifier = format!("/{}", event.shortcut.identifier());
if let Ok(signal_interface) = server.interface::<_, ShortcutSignal>(identifier).await {
if let Err(e) = ShortcutSignal::triggered(
signal_interface.signal_context(),
signal_interface.signal_emitter(),
event.state == ShortcutState::Pressed,
)
.await