1use pinnacle_api_defs::pinnacle::{
10 self,
11 v1::{
12 BackendRequest, KeepaliveRequest, KeepaliveResponse, QuitRequest, ReloadConfigRequest,
13 SetLastErrorRequest, SetXwaylandClientSelfScaleRequest, TakeLastErrorRequest,
14 },
15};
16use tonic::Streaming;
17
18use crate::{client::Client, BlockOnTokio};
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22pub enum Backend {
23 Tty,
25 Window,
28}
29
30pub fn quit() {
32 let _ = Client::pinnacle().quit(QuitRequest {}).block_on_tokio();
34}
35
36pub fn reload_config() {
38 let _ = Client::pinnacle()
40 .reload_config(ReloadConfigRequest {})
41 .block_on_tokio();
42}
43
44pub fn backend() -> Backend {
46 let backend = Client::pinnacle()
47 .backend(BackendRequest {})
48 .block_on_tokio()
49 .unwrap()
50 .into_inner()
51 .backend();
52
53 match backend {
54 pinnacle::v1::Backend::Unspecified => panic!("received unspecified backend"),
55 pinnacle::v1::Backend::Window => Backend::Window,
56 pinnacle::v1::Backend::Tty => Backend::Tty,
57 }
58}
59
60pub fn set_xwayland_self_scaling(should_self_scale: bool) {
71 Client::pinnacle()
72 .set_xwayland_client_self_scale(SetXwaylandClientSelfScaleRequest {
73 self_scale: should_self_scale,
74 })
75 .block_on_tokio()
76 .unwrap();
77}
78
79pub fn set_last_error(error: impl std::fmt::Display) {
81 Client::pinnacle()
82 .set_last_error(SetLastErrorRequest {
83 error: error.to_string(),
84 })
85 .block_on_tokio()
86 .unwrap();
87}
88
89pub fn take_last_error() -> Option<String> {
92 Client::pinnacle()
93 .take_last_error(TakeLastErrorRequest {})
94 .block_on_tokio()
95 .unwrap()
96 .into_inner()
97 .error
98}
99
100pub(crate) async fn keepalive() -> (
101 tokio::sync::mpsc::Sender<KeepaliveRequest>,
102 Streaming<KeepaliveResponse>,
103) {
104 let (send, recv) = tokio::sync::mpsc::channel::<KeepaliveRequest>(5);
105 let recv = tokio_stream::wrappers::ReceiverStream::new(recv);
106 let streaming = Client::pinnacle()
107 .keepalive(recv)
108 .await
109 .unwrap()
110 .into_inner();
111 (send, streaming)
112}