From 7d9ce50702de93b573843b67387d98e36bc3f694 Mon Sep 17 00:00:00 2001 From: Yash Srivastav Date: Wed, 27 Mar 2019 00:23:16 +0530 Subject: [PATCH 1/3] Implement xidlehook-client for communicating over daemon socket --- src/bin/xidlehook-client.rs | 60 +++++++++++++++++++++++++++++++ src/{main.rs => bin/xidlehook.rs} | 4 +-- src/lib.rs | 14 ++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/bin/xidlehook-client.rs rename src/{main.rs => bin/xidlehook.rs} (99%) create mode 100644 src/lib.rs diff --git a/src/bin/xidlehook-client.rs b/src/bin/xidlehook-client.rs new file mode 100644 index 0000000..56a34e0 --- /dev/null +++ b/src/bin/xidlehook-client.rs @@ -0,0 +1,60 @@ +#[macro_use] extern crate clap; +extern crate failure; + +use clap::{App as ClapApp, Arg}; +use failure::Error; +use std::{io::Write, os::unix::net::UnixStream}; + +fn main() -> Result<(), Error> { + let clap_app = ClapApp::new(crate_name!()) + .author(crate_authors!()) + .version(crate_version!()) + // Flags + .arg( + Arg::with_name("disable") + .help("Disable xidlehook timers.") + .long("disable") + .required_unless_one(&["enable", "trigger"]), + ) + .arg( + Arg::with_name("enable") + .help("Enable xidlehook timers.") + .long("enable") + .required_unless_one(&["disable", "trigger"]), + ) + .arg( + Arg::with_name("trigger") + .help("Execute the primary timer immediately.") + .long("trigger") + .required_unless_one(&["disable", "enable"]), + ) + // Options + .arg( + Arg::with_name("socket") + .long_help( + "\ + Listen to events over a specified unix socket.\n\ + Events are as following:\n\ + \t0x0 - Disable xidlehook\n\ + \t0x1 - Re-enable xidlehook\n\ + \t0x2 - Trigger the timer immediately\n\ + ", + ) + .long("socket") + .takes_value(true) + .required(true), + ); + let matches = clap_app.get_matches(); + // socket necessarily exists as it is a required param + let socket = matches.value_of("socket").unwrap(); + let mut socket = UnixStream::connect(&socket)?; + let control_byte = if matches.is_present("disable") { + b"\x00" + } else if matches.is_present("enable") { + b"\x01" + } else { + b"\x02" + }; + socket.write_all(control_byte)?; + return Ok(()); +} diff --git a/src/main.rs b/src/bin/xidlehook.rs similarity index 99% rename from src/main.rs rename to src/bin/xidlehook.rs index 691e1df..c13b9cc 100644 --- a/src/main.rs +++ b/src/bin/xidlehook.rs @@ -31,8 +31,8 @@ use std::{ }; use x11::xss::{XScreenSaverAllocInfo, XScreenSaverInfo}; -#[cfg(feature = "pulse")] mod pulse; -mod x11api; +extern crate xidlehook; +use xidlehook::*; #[cfg(feature = "pulse")] use pulse::PulseAudio; use x11api::{XDisplay, XPtr}; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..0071c21 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,14 @@ +#[macro_use] extern crate failure; +#[cfg(feature = "pulse")] extern crate libpulse_sys; +extern crate x11; + +#[cfg(feature = "pulse")] pub mod pulse; +pub mod x11api; + +#[derive(Debug, Fail)] +pub enum MyError { + #[fail(display = "failed to open x display")] + XDisplay, + #[fail(display = "failed to query for screen saver info")] + XScreenSaver +} From 4315e1b456aee1c37292005a4dce8774b76c64d8 Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Tue, 26 Mar 2019 20:23:19 +0100 Subject: [PATCH 2/3] Minor cleanup --- Cargo.lock | 2 ++ Cargo.toml | 4 ++++ src/bin/xidlehook-client.rs | 40 +++++++++++++------------------ src/lib.rs | 14 ----------- src/{bin/xidlehook.rs => main.rs} | 10 ++++---- 5 files changed, 27 insertions(+), 43 deletions(-) delete mode 100644 src/lib.rs rename src/{bin/xidlehook.rs => main.rs} (98%) diff --git a/Cargo.lock b/Cargo.lock index 74e656c..722b62f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. [[package]] name = "ansi_term" version = "0.11.0" diff --git a/Cargo.toml b/Cargo.toml index 18d99c4..4f93d11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,5 @@ +#cargo-features = [ "default-run" ] + [package] authors = ["jD91mZM2 "] description = "xautolock rewrite in Rust, with a few extra features" @@ -6,6 +8,8 @@ name = "xidlehook" readme = "README.md" repository = "https://github.com/jD91mZM2/xidlehook" version = "0.6.2" +#default-run = "xidlehook" + [dependencies] clap = "2.32.0" failure = "0.1.5" diff --git a/src/bin/xidlehook-client.rs b/src/bin/xidlehook-client.rs index 56a34e0..3798e05 100644 --- a/src/bin/xidlehook-client.rs +++ b/src/bin/xidlehook-client.rs @@ -1,60 +1,54 @@ #[macro_use] extern crate clap; extern crate failure; -use clap::{App as ClapApp, Arg}; +use clap::Arg; use failure::Error; use std::{io::Write, os::unix::net::UnixStream}; fn main() -> Result<(), Error> { - let clap_app = ClapApp::new(crate_name!()) - .author(crate_authors!()) - .version(crate_version!()) + let matches = app_from_crate!() // Flags .arg( Arg::with_name("disable") - .help("Disable xidlehook timers.") + .help("Disable xidlehook timers") .long("disable") .required_unless_one(&["enable", "trigger"]), ) .arg( Arg::with_name("enable") - .help("Enable xidlehook timers.") + .help("Enable xidlehook timers") .long("enable") .required_unless_one(&["disable", "trigger"]), ) .arg( Arg::with_name("trigger") - .help("Execute the primary timer immediately.") + .help("Execute the primary timer immediately") .long("trigger") .required_unless_one(&["disable", "enable"]), ) // Options .arg( Arg::with_name("socket") - .long_help( - "\ - Listen to events over a specified unix socket.\n\ - Events are as following:\n\ - \t0x0 - Disable xidlehook\n\ - \t0x1 - Re-enable xidlehook\n\ - \t0x2 - Trigger the timer immediately\n\ - ", - ) + .help("Specify which socket the client should communicate over") .long("socket") .takes_value(true) .required(true), - ); - let matches = clap_app.get_matches(); - // socket necessarily exists as it is a required param + ) + .get_matches(); + let socket = matches.value_of("socket").unwrap(); let mut socket = UnixStream::connect(&socket)?; + let control_byte = if matches.is_present("disable") { - b"\x00" + 0 } else if matches.is_present("enable") { - b"\x01" + 1 + } else if matches.is_present("trigger") { + 2 } else { - b"\x02" + unreachable!("One of --enable, --disable or --trigger should have been set at this point"); }; - socket.write_all(control_byte)?; + socket.write_all(&[control_byte])?; + return Ok(()); } diff --git a/src/lib.rs b/src/lib.rs deleted file mode 100644 index 0071c21..0000000 --- a/src/lib.rs +++ /dev/null @@ -1,14 +0,0 @@ -#[macro_use] extern crate failure; -#[cfg(feature = "pulse")] extern crate libpulse_sys; -extern crate x11; - -#[cfg(feature = "pulse")] pub mod pulse; -pub mod x11api; - -#[derive(Debug, Fail)] -pub enum MyError { - #[fail(display = "failed to open x display")] - XDisplay, - #[fail(display = "failed to query for screen saver info")] - XScreenSaver -} diff --git a/src/bin/xidlehook.rs b/src/main.rs similarity index 98% rename from src/bin/xidlehook.rs rename to src/main.rs index c13b9cc..6aaae6c 100644 --- a/src/bin/xidlehook.rs +++ b/src/main.rs @@ -6,7 +6,7 @@ extern crate mio; extern crate x11; #[cfg(feature = "pulse")] use std::sync::mpsc; -use clap::{App as ClapApp, Arg}; +use clap::Arg; use failure::Error; use mio::{*, unix::EventedFd}; #[cfg(feature = "nix")] @@ -31,8 +31,8 @@ use std::{ }; use x11::xss::{XScreenSaverAllocInfo, XScreenSaverInfo}; -extern crate xidlehook; -use xidlehook::*; +#[cfg(feature = "pulse")] mod pulse; +mod x11api; #[cfg(feature = "pulse")] use pulse::PulseAudio; use x11api::{XDisplay, XPtr}; @@ -70,9 +70,7 @@ fn maybe(res: io::Result) -> io::Result> { } fn main() -> Result<(), Error> { - let clap_app = ClapApp::new(crate_name!()) - .author(crate_authors!()) - .version(crate_version!()) + let clap_app = app_from_crate!() // Flags .arg( Arg::with_name("print") From d6cbe1105c59387b0d0ab4bc70675b2606012630 Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Tue, 26 Mar 2019 20:31:52 +0100 Subject: [PATCH 3/3] Update README --- README.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2d02643..7b7152c 100644 --- a/README.md +++ b/README.md @@ -87,9 +87,22 @@ whatever you want), and then you can send one of the following bytes: | 1 | Activate | | 2 | Run the timer command immediately | +For convenience, there is now an xidlehook-client (see +[#18](https://github.com/jD91mZM2/xidlehook/pull/18)), which will communicate +with this API for you. See +``` +xidlehook-client --help +``` +for details. + A common use case of `xidlehook` is using it to run a lockscreen. To then manually lock the screen, you could bind this bash command to a shortcut: +``` +xidlehook-client --trigger --socket /path/to/xidlehook.sock +``` -```sh -echo -ne "\x2" | socat - /path/to/xidlehook.sock +Alternatively, you can use the API directly using, for example, `socat`: +``` +echo -ne "\x0" | socat - UNIX-CONNECT:/path/to/xidlehook.sock ``` +(You have no reason to run this for the most cases anymore)