config: split resource handling
This commit is contained in:
parent
b08a8b63c9
commit
274e7c0602
2 changed files with 138 additions and 134 deletions
|
|
@ -91,6 +91,7 @@ mod dispatch;
|
|||
mod input_devices;
|
||||
mod matchers;
|
||||
mod outputs;
|
||||
mod resources;
|
||||
mod theme;
|
||||
mod windows;
|
||||
mod workspaces;
|
||||
|
|
@ -403,20 +404,6 @@ impl ConfigProxyHandler {
|
|||
self.state.set_status(status);
|
||||
}
|
||||
|
||||
fn get_timer(&self, timer: JayTimer) -> Result<Rc<TimerData>, CphError> {
|
||||
match self.timers_by_id.get(&timer.0) {
|
||||
Some(t) => Ok(t),
|
||||
_ => Err(CphError::TimerDoesNotExist(timer)),
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_remove_timer(&self, timer: JayTimer) -> Result<(), CphError> {
|
||||
let timer = self.get_timer(timer)?;
|
||||
self.timers_by_id.remove(&timer.id);
|
||||
self.timers_by_name.remove(&timer.name);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_set_env(&self, key: &str, val: &str) {
|
||||
if let Some(f) = self.state.forker.get() {
|
||||
f.setenv(key.as_bytes(), val.as_bytes());
|
||||
|
|
@ -434,61 +421,6 @@ impl ConfigProxyHandler {
|
|||
self.respond(Response::GetConfigDir { dir });
|
||||
}
|
||||
|
||||
fn handle_program_timer(
|
||||
&self,
|
||||
timer: JayTimer,
|
||||
initial: Option<Duration>,
|
||||
periodic: Option<Duration>,
|
||||
) -> Result<(), CphError> {
|
||||
let timer = self.get_timer(timer)?;
|
||||
timer.timer.program(initial, periodic)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_get_timer(self: &Rc<Self>, name: &str) -> Result<(), CphError> {
|
||||
let name = Rc::new(name.to_owned());
|
||||
if let Some(t) = self.timers_by_name.get(&name) {
|
||||
self.respond(Response::GetTimer {
|
||||
timer: JayTimer(t.id),
|
||||
});
|
||||
return Ok(());
|
||||
}
|
||||
let id = self.timer_ids.fetch_add(1);
|
||||
let timer = TimerFd::new(c::CLOCK_BOOTTIME)?;
|
||||
let handler = {
|
||||
let timer = timer.clone();
|
||||
let slf = self.clone();
|
||||
self.state.eng.spawn("config timer", async move {
|
||||
loop {
|
||||
match timer.expired(&slf.state.ring).await {
|
||||
Ok(_) => slf.send(&ServerMessage::TimerExpired {
|
||||
timer: JayTimer(id),
|
||||
}),
|
||||
Err(e) => {
|
||||
log::error!("Could not wait for timer expiration: {}", ErrorFmt(e));
|
||||
if let Some(timer) = slf.timers_by_id.remove(&id) {
|
||||
slf.timers_by_name.remove(&timer.name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
let td = Rc::new(TimerData {
|
||||
timer,
|
||||
id,
|
||||
name: name.clone(),
|
||||
_handler: handler,
|
||||
});
|
||||
self.timers_by_name.set(name.clone(), td.clone());
|
||||
self.timers_by_id.set(id, td.clone());
|
||||
self.respond(Response::GetTimer {
|
||||
timer: JayTimer(id),
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_seat_close(&self, seat: Seat) -> Result<(), CphError> {
|
||||
let seat = self.get_seat(seat)?;
|
||||
seat.close();
|
||||
|
|
@ -1037,71 +969,6 @@ impl ConfigProxyHandler {
|
|||
})
|
||||
}
|
||||
|
||||
fn handle_add_pollable(self: &Rc<Self>, fd: i32) -> Result<(), CphError> {
|
||||
let fd = match fcntl_dupfd_cloexec(fd, 0).to_os_error() {
|
||||
Ok(fd) => Rc::new(fd),
|
||||
Err(e) => {
|
||||
let err = format!("Could not invoke F_DUPFD_CLOEXEC: {}", ErrorFmt(e));
|
||||
log::error!("{}", err);
|
||||
self.respond(Response::AddPollable { id: Err(err) });
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
let id = self.pollable_id.fetch_add(1);
|
||||
let id = PollableId(id);
|
||||
let create = |writable: bool, events: c::c_short| {
|
||||
let event = Rc::new(AsyncEvent::default());
|
||||
let slf = self.clone();
|
||||
let trigger = event.clone();
|
||||
let fd = fd.clone();
|
||||
let future = self.state.eng.spawn("config fd poller", async move {
|
||||
loop {
|
||||
trigger.triggered().await;
|
||||
let res = slf.state.ring.poll(&fd, events).await.merge();
|
||||
if let Err(e) = &res {
|
||||
log::warn!("Could not poll fd: {}", ErrorFmt(e));
|
||||
}
|
||||
let res = res.map_err(|e| ErrorFmt(e).to_string()).map(drop);
|
||||
slf.send(&ServerMessage::InterestReady { id, writable, res });
|
||||
}
|
||||
});
|
||||
(event, future)
|
||||
};
|
||||
let (read_trigger, _read_future) = create(false, c::POLLIN);
|
||||
let (write_trigger, _write_future) = create(true, c::POLLOUT);
|
||||
self.pollables.set(
|
||||
id,
|
||||
Rc::new(Pollable {
|
||||
write_trigger,
|
||||
_write_future,
|
||||
read_trigger,
|
||||
_read_future,
|
||||
}),
|
||||
);
|
||||
self.respond(Response::AddPollable { id: Ok(id) });
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_remove_pollable(self: &Rc<Self>, id: PollableId) {
|
||||
self.pollables.remove(&id);
|
||||
}
|
||||
|
||||
fn handle_add_interest(
|
||||
self: &Rc<Self>,
|
||||
id: PollableId,
|
||||
writable: bool,
|
||||
) -> Result<(), CphError> {
|
||||
let Some(pollable) = self.pollables.get(&id) else {
|
||||
return Err(CphError::PollableDoesNotExist);
|
||||
};
|
||||
let trigger = match writable {
|
||||
true => &pollable.write_trigger,
|
||||
false => &pollable.read_trigger,
|
||||
};
|
||||
trigger.trigger();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn handle_set_pointer_revert_key(&self, seat: Seat, key: KeySym) -> Result<(), CphError> {
|
||||
self.get_seat(seat)?.set_pointer_revert_key(key);
|
||||
Ok(())
|
||||
|
|
|
|||
137
src/config/handler/resources.rs
Normal file
137
src/config/handler/resources.rs
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
use super::*;
|
||||
|
||||
impl ConfigProxyHandler {
|
||||
fn get_timer(&self, timer: JayTimer) -> Result<Rc<TimerData>, CphError> {
|
||||
match self.timers_by_id.get(&timer.0) {
|
||||
Some(t) => Ok(t),
|
||||
_ => Err(CphError::TimerDoesNotExist(timer)),
|
||||
}
|
||||
}
|
||||
|
||||
pub(super) fn handle_remove_timer(&self, timer: JayTimer) -> Result<(), CphError> {
|
||||
let timer = self.get_timer(timer)?;
|
||||
self.timers_by_id.remove(&timer.id);
|
||||
self.timers_by_name.remove(&timer.name);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn handle_program_timer(
|
||||
&self,
|
||||
timer: JayTimer,
|
||||
initial: Option<Duration>,
|
||||
periodic: Option<Duration>,
|
||||
) -> Result<(), CphError> {
|
||||
let timer = self.get_timer(timer)?;
|
||||
timer.timer.program(initial, periodic)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn handle_get_timer(self: &Rc<Self>, name: &str) -> Result<(), CphError> {
|
||||
let name = Rc::new(name.to_owned());
|
||||
if let Some(t) = self.timers_by_name.get(&name) {
|
||||
self.respond(Response::GetTimer {
|
||||
timer: JayTimer(t.id),
|
||||
});
|
||||
return Ok(());
|
||||
}
|
||||
let id = self.timer_ids.fetch_add(1);
|
||||
let timer = TimerFd::new(c::CLOCK_BOOTTIME)?;
|
||||
let handler = {
|
||||
let timer = timer.clone();
|
||||
let slf = self.clone();
|
||||
self.state.eng.spawn("config timer", async move {
|
||||
loop {
|
||||
match timer.expired(&slf.state.ring).await {
|
||||
Ok(_) => slf.send(&ServerMessage::TimerExpired {
|
||||
timer: JayTimer(id),
|
||||
}),
|
||||
Err(e) => {
|
||||
log::error!("Could not wait for timer expiration: {}", ErrorFmt(e));
|
||||
if let Some(timer) = slf.timers_by_id.remove(&id) {
|
||||
slf.timers_by_name.remove(&timer.name);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
};
|
||||
let td = Rc::new(TimerData {
|
||||
timer,
|
||||
id,
|
||||
name: name.clone(),
|
||||
_handler: handler,
|
||||
});
|
||||
self.timers_by_name.set(name.clone(), td.clone());
|
||||
self.timers_by_id.set(id, td.clone());
|
||||
self.respond(Response::GetTimer {
|
||||
timer: JayTimer(id),
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn handle_add_pollable(self: &Rc<Self>, fd: i32) -> Result<(), CphError> {
|
||||
let fd = match fcntl_dupfd_cloexec(fd, 0).to_os_error() {
|
||||
Ok(fd) => Rc::new(fd),
|
||||
Err(e) => {
|
||||
let err = format!("Could not invoke F_DUPFD_CLOEXEC: {}", ErrorFmt(e));
|
||||
log::error!("{}", err);
|
||||
self.respond(Response::AddPollable { id: Err(err) });
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
let id = self.pollable_id.fetch_add(1);
|
||||
let id = PollableId(id);
|
||||
let create = |writable: bool, events: c::c_short| {
|
||||
let event = Rc::new(AsyncEvent::default());
|
||||
let slf = self.clone();
|
||||
let trigger = event.clone();
|
||||
let fd = fd.clone();
|
||||
let future = self.state.eng.spawn("config fd poller", async move {
|
||||
loop {
|
||||
trigger.triggered().await;
|
||||
let res = slf.state.ring.poll(&fd, events).await.merge();
|
||||
if let Err(e) = &res {
|
||||
log::warn!("Could not poll fd: {}", ErrorFmt(e));
|
||||
}
|
||||
let res = res.map_err(|e| ErrorFmt(e).to_string()).map(drop);
|
||||
slf.send(&ServerMessage::InterestReady { id, writable, res });
|
||||
}
|
||||
});
|
||||
(event, future)
|
||||
};
|
||||
let (read_trigger, _read_future) = create(false, c::POLLIN);
|
||||
let (write_trigger, _write_future) = create(true, c::POLLOUT);
|
||||
self.pollables.set(
|
||||
id,
|
||||
Rc::new(Pollable {
|
||||
write_trigger,
|
||||
_write_future,
|
||||
read_trigger,
|
||||
_read_future,
|
||||
}),
|
||||
);
|
||||
self.respond(Response::AddPollable { id: Ok(id) });
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn handle_remove_pollable(self: &Rc<Self>, id: PollableId) {
|
||||
self.pollables.remove(&id);
|
||||
}
|
||||
|
||||
pub(super) fn handle_add_interest(
|
||||
self: &Rc<Self>,
|
||||
id: PollableId,
|
||||
writable: bool,
|
||||
) -> Result<(), CphError> {
|
||||
let Some(pollable) = self.pollables.get(&id) else {
|
||||
return Err(CphError::PollableDoesNotExist);
|
||||
};
|
||||
let trigger = match writable {
|
||||
true => &pollable.write_trigger,
|
||||
false => &pollable.read_trigger,
|
||||
};
|
||||
trigger.trigger();
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue