summaryrefslogtreecommitdiff
path: root/src/status_cmd.rs
diff options
context:
space:
mode:
authorMax Verevkin <34583604+MaxVerevkin@users.noreply.github.com>2022-11-27 21:25:15 +0200
committerGitHub <noreply@github.com>2022-11-27 21:25:15 +0200
commitd28693c9d293ea7c348c0e9e1a4e89ccff6dcae4 (patch)
tree0794e56251e223388463a84d09616ef47a918bb4 /src/status_cmd.rs
parent9ddde2d2ee9833412e39afbd1ed907cdea22f08f (diff)
parentd45a4ef408c0f5a2071194d4c3285f0b7cb27dd0 (diff)
downloadi3bar-mango-d28693c9d293ea7c348c0e9e1a4e89ccff6dcae4.tar.gz
Merge pull request #1 from MaxVerevkin/next
Rewrite using latest walayd libs & implement HiDPI
Diffstat (limited to 'src/status_cmd.rs')
-rw-r--r--src/status_cmd.rs71
1 files changed, 40 insertions, 31 deletions
diff --git a/src/status_cmd.rs b/src/status_cmd.rs
index a229200..4d9c453 100644
--- a/src/status_cmd.rs
+++ b/src/status_cmd.rs
@@ -1,18 +1,22 @@
-use std::io::{BufRead, BufReader, Result, Write};
+use std::io::{BufRead, BufReader, Write};
use std::os::unix::prelude::AsRawFd;
use std::process::{Child, ChildStdin, ChildStdout, Command, Stdio};
-use smithay_client_toolkit::reexports::calloop::{self, LoopHandle};
+use anyhow::Result;
+
+use tokio::io::unix::AsyncFd;
+use tokio::io::Interest;
use crate::i3bar_protocol::{Block, Event, Protocol};
-use crate::BarState;
+#[derive(Debug)]
pub struct StatusCmd {
- child: Child,
+ pub child: Child,
output: BufReader<ChildStdout>,
input: ChildStdin,
protocol: Protocol,
buf: Vec<u8>,
+ pub async_fd: AsyncFd<i32>,
}
impl StatusCmd {
@@ -24,17 +28,22 @@ impl StatusCmd {
.spawn()?;
let output = child.stdout.take().unwrap();
let input = child.stdin.take().unwrap();
+ let async_fd = AsyncFd::with_interest(output.as_raw_fd(), Interest::READABLE)?;
Ok(Self {
child,
output: BufReader::new(output),
input,
protocol: Protocol::Unknown,
buf: Vec::new(),
+ async_fd,
})
}
pub fn notify_available(&mut self) -> Result<Option<Vec<Block>>> {
let buf = self.output.fill_buf()?;
+ if buf.is_empty() {
+ bail!("status command exited");
+ }
if self.buf.is_empty() {
let rem = self.protocol.process_new_bytes(buf)?;
if !rem.is_empty() {
@@ -57,35 +66,35 @@ impl StatusCmd {
pub fn send_click_event(&mut self, event: &Event) -> Result<()> {
if self.protocol.supports_clicks() {
- writeln!(self.input, "{}", serde_json::to_string(event).unwrap(),)?;
+ writeln!(self.input, "{}", serde_json::to_string(event).unwrap())?;
}
Ok(())
}
- pub fn quick_insert(&self, handle: LoopHandle<BarState>) {
- handle
- .insert_source(
- calloop::generic::Generic::new(
- self.output.get_ref().as_raw_fd(),
- calloop::Interest {
- readable: true,
- writable: false,
- },
- calloop::Mode::Level,
- ),
- move |ready, _, bar_state| {
- if ready.readable {
- bar_state.notify_available()?;
- Ok(calloop::PostAction::Continue)
- } else {
- bar_state.set_error("error reading from status command");
- if let Some(mut child) = bar_state.status_cmd.take() {
- let _ = child.child.kill();
- }
- Ok(calloop::PostAction::Remove)
- }
- },
- )
- .expect("failed to inser calloop source");
- }
+ // pub fn quick_insert(&self, handle: LoopHandle<BarState>) {
+ // handle
+ // .insert_source(
+ // calloop::generic::Generic::new(
+ // self.output.get_ref().as_raw_fd(),
+ // calloop::Interest {
+ // readable: true,
+ // writable: false,
+ // },
+ // calloop::Mode::Level,
+ // ),
+ // move |ready, _, bar_state| {
+ // if ready.readable {
+ // bar_state.notify_available()?;
+ // Ok(calloop::PostAction::Continue)
+ // } else {
+ // bar_state.set_error("error reading from status command");
+ // if let Some(mut child) = bar_state.status_cmd.take() {
+ // let _ = child.child.kill();
+ // }
+ // Ok(calloop::PostAction::Remove)
+ // }
+ // },
+ // )
+ // .expect("failed to inser calloop source");
+ // }
}