From 274e7c0602dab7d9a91f62a5568a544b4bfc9c64 Mon Sep 17 00:00:00 2001 From: kossLAN Date: Fri, 29 May 2026 19:10:36 -0400 Subject: [PATCH] config: split resource handling --- src/config/handler.rs | 135 +------------------------------ src/config/handler/resources.rs | 137 ++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 134 deletions(-) create mode 100644 src/config/handler/resources.rs diff --git a/src/config/handler.rs b/src/config/handler.rs index f35c206e..69a99da5 100644 --- a/src/config/handler.rs +++ b/src/config/handler.rs @@ -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, 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, - periodic: Option, - ) -> Result<(), CphError> { - let timer = self.get_timer(timer)?; - timer.timer.program(initial, periodic)?; - Ok(()) - } - - fn handle_get_timer(self: &Rc, 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, 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, id: PollableId) { - self.pollables.remove(&id); - } - - fn handle_add_interest( - self: &Rc, - 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(()) diff --git a/src/config/handler/resources.rs b/src/config/handler/resources.rs new file mode 100644 index 00000000..0f72c0c2 --- /dev/null +++ b/src/config/handler/resources.rs @@ -0,0 +1,137 @@ +use super::*; + +impl ConfigProxyHandler { + fn get_timer(&self, timer: JayTimer) -> Result, 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, + periodic: Option, + ) -> Result<(), CphError> { + let timer = self.get_timer(timer)?; + timer.timer.program(initial, periodic)?; + Ok(()) + } + + pub(super) fn handle_get_timer(self: &Rc, 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, 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, id: PollableId) { + self.pollables.remove(&id); + } + + pub(super) fn handle_add_interest( + self: &Rc, + 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(()) + } +}