feat: implement fullstate on-connect event
This commit is contained in:
parent
05e12ea2f2
commit
73813605d6
4 changed files with 66 additions and 14 deletions
|
@ -4,7 +4,7 @@ use niri_ipc::{
|
|||
Action, Event, Reply, Request, Response, Window, Workspace, WorkspaceReferenceArg,
|
||||
state::{EventStreamState, EventStreamStatePart},
|
||||
};
|
||||
use niri_tag::{TagCmd, TagEvent};
|
||||
use niri_tag::{TagCmd, TagEvent, TagState};
|
||||
use smol::{
|
||||
channel::{self, Sender},
|
||||
future,
|
||||
|
@ -234,6 +234,25 @@ impl NiriTag {
|
|||
let _ = self.state.apply(ev.clone());
|
||||
return self.handle_event(ev).await;
|
||||
}
|
||||
Receivable::FullState(tx) => {
|
||||
tracing::debug!("received request for full state");
|
||||
let fullstate: HashMap<u8, TagState> = self
|
||||
.tags
|
||||
.iter()
|
||||
.map(|(&t, &enabled)| {
|
||||
(
|
||||
t,
|
||||
TagState {
|
||||
enabled,
|
||||
occupied: self.windows.values().filter(|w_t| **w_t == t).count()
|
||||
> 0,
|
||||
urgent: false, // urgency is TODO
|
||||
},
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
return tx.send(fullstate).await.map_err(|e| anyhow!(e));
|
||||
}
|
||||
Receivable::TagCmd(cmd) => match cmd {
|
||||
TagCmd::AddTagToWin(t) => {
|
||||
let win = self.get_focused_window().await?;
|
||||
|
@ -322,16 +341,20 @@ impl NiriTag {
|
|||
mut self,
|
||||
ev_rx: channel::Receiver<Event>,
|
||||
tag_rx: channel::Receiver<TagCmd>,
|
||||
fullstate_rx: channel::Receiver<channel::Sender<HashMap<u8, TagState>>>,
|
||||
) -> Result<()> {
|
||||
// base tag is always visible
|
||||
self.tags.insert(0, true);
|
||||
|
||||
loop {
|
||||
let recvd: Receivable =
|
||||
future::or(async { ev_rx.recv().await.map(Receivable::Event) }, async {
|
||||
tag_rx.recv().await.map(Receivable::TagCmd)
|
||||
})
|
||||
.await?;
|
||||
let recvd: Receivable = future::or(
|
||||
async { ev_rx.recv().await.map(Receivable::Event) },
|
||||
future::or(
|
||||
async { tag_rx.recv().await.map(Receivable::TagCmd) },
|
||||
async { fullstate_rx.recv().await.map(Receivable::FullState) },
|
||||
),
|
||||
)
|
||||
.await?;
|
||||
tracing::debug!("manager received {:?}", recvd);
|
||||
|
||||
let res = self.handle_recvd(recvd).await;
|
||||
|
@ -349,4 +372,5 @@ impl NiriTag {
|
|||
enum Receivable {
|
||||
Event(Event),
|
||||
TagCmd(TagCmd),
|
||||
FullState(channel::Sender<HashMap<u8, TagState>>),
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue