Skip to main content

halley_ipc/
lib.rs

1pub mod codec;
2pub mod error;
3pub mod protocol;
4pub mod types;
5
6pub use codec::{
7    decode_request, decode_response, encode_request, encode_response, read_frame, write_frame,
8};
9pub use error::{CodecError, IpcError};
10pub use protocol::{
11    BearingsRequest, CaptureMode, CaptureRequest, ClusterRequest, ClusterTarget, CompositorRequest,
12    DpmsCommand, MonitorFocusDirection, MonitorFocusTarget, MonitorRequest, NodeMoveDirection,
13    NodeRequest, NodeSelector, Request, Response, StackCycleDirection, StackRequest, TileRequest,
14    TrailDirection, TrailRequest, TrailTarget,
15};
16pub use types::{
17    ApertureMode, ApertureStatusResponse, BearingsStatusResponse, CaptureStatusResponse,
18    ClusterInfo, ClusterLayoutKind, ClusterListResponse, ClusterOutputGroup, ClusterSummary,
19    LogicalOutputInfo, ModeInfo, NodeInfo, NodeKind, NodeListResponse, NodeOutputGroup,
20    NodeProtocolFamily, NodeRelationInfo, NodeRole, NodeState, OutputInfo, OutputStatus,
21    OutputsResponse, TrailEntryInfo, TrailListResponse,
22};
23
24use std::env;
25use std::io;
26use std::os::unix::net::UnixStream;
27use std::path::PathBuf;
28
29pub fn default_socket_path() -> io::Result<PathBuf> {
30    let runtime_dir = env::var_os("XDG_RUNTIME_DIR")
31        .ok_or_else(|| io::Error::new(io::ErrorKind::NotFound, "XDG_RUNTIME_DIR is not set"))?;
32    Ok(PathBuf::from(runtime_dir)
33        .join("halley")
34        .join("halley.sock"))
35}
36
37pub fn send_request(req: &Request) -> Result<Response, CodecError> {
38    let path = default_socket_path()?;
39    send_request_to(&path, req)
40}
41
42pub fn send_request_to(path: &std::path::Path, req: &Request) -> Result<Response, CodecError> {
43    let mut stream = UnixStream::connect(path)?;
44    let bytes = encode_request(req)?;
45    write_frame(&mut stream, &bytes)?;
46
47    let resp_bytes = read_frame(&mut stream)?;
48    decode_response(&resp_bytes)
49}