From 2570f39b5daf6e2a13b3973d47aa7c67fbb457fb Mon Sep 17 00:00:00 2001 From: MaxVerevkin Date: Sat, 10 Dec 2022 17:46:48 +0200 Subject: refactor --- src/bar.rs | 37 +++++++----- src/main.rs | 2 - src/river_protocols/status.rs | 135 +++++++++++------------------------------- src/shared_state.rs | 16 +---- src/state.rs | 80 +++++++------------------ 5 files changed, 83 insertions(+), 187 deletions(-) (limited to 'src') diff --git a/src/bar.rs b/src/bar.rs index b68aefa..90215a2 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -2,7 +2,7 @@ use std::collections::BinaryHeap; use pangocairo::cairo; use smithay_client_toolkit::{ - reexports::client::protocol::{wl_seat, wl_shm}, + reexports::client::protocol::{wl_output, wl_seat, wl_shm}, shell::layer::LayerSurface, }; @@ -20,6 +20,7 @@ use crate::{ }; pub struct Bar { + pub output: wl_output::WlOutput, pub configured: bool, pub width: u32, pub height: u32, @@ -29,6 +30,7 @@ pub struct Bar { pub river_output_status: Option, pub river_control: Option, pub layout_name: Option, + pub layout_name_computed: Option, pub tags_btns: ButtonManager, pub tags_info: TagsInfo, pub tags_computed: Vec, @@ -50,6 +52,11 @@ impl Bar { self.river_output_status.is_some() } + pub fn set_layout_name(&mut self, layout_name: Option) { + self.layout_name_computed = None; + self.layout_name = layout_name; + } + pub fn click( &mut self, ss: &mut SharedState, @@ -92,7 +99,7 @@ impl Bar { let height_f = height as f64; let (buffer, canvas) = ss - .get_pool(height as usize * stride as usize) + .pool .create_buffer( width * self.scale, height * self.scale, @@ -175,18 +182,20 @@ impl Bar { // Display layout name if let Some(layout_name) = &self.layout_name { - let text = ComputedText::new( - layout_name, - text::Attributes { - font: &ss.config.font, - padding_left: 25.0, - padding_right: 25.0, - min_width: None, - align: Default::default(), - markup: false, - }, - &cairo_ctx, - ); + let text = self.layout_name_computed.get_or_insert_with(|| { + ComputedText::new( + layout_name, + text::Attributes { + font: &ss.config.font, + padding_left: 25.0, + padding_right: 25.0, + min_width: None, + align: Default::default(), + markup: false, + }, + &cairo_ctx, + ) + }); text.render( &cairo_ctx, RenderOptions { diff --git a/src/main.rs b/src/main.rs index 8ae31aa..3dad693 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,8 +39,6 @@ async fn main() -> anyhow::Result<()> { Interest::READABLE, )?; - event_queue.roundtrip(&mut state)?; - loop { tokio::select! { readable = async_fd.readable() => { diff --git a/src/river_protocols/status.rs b/src/river_protocols/status.rs index 4424c58..ad93279 100644 --- a/src/river_protocols/status.rs +++ b/src/river_protocols/status.rs @@ -1,5 +1,3 @@ -use std::sync::{Arc, Weak}; - use wayland_client::{ globals::{BindError, GlobalList}, protocol::wl_output, @@ -11,7 +9,6 @@ use protocol::{zriver_output_status_v1, zriver_status_manager_v1}; #[derive(Debug, Clone)] pub struct RiverStatusState { status_manager: zriver_status_manager_v1::ZriverStatusManagerV1, - output_statuses: Vec>, } impl RiverStatusState { @@ -19,22 +16,8 @@ impl RiverStatusState { where D: Dispatch + 'static, { - let status_manager = globals.bind(qh, 1..=3, ())?; - Ok(Self { - status_manager, - output_statuses: Vec::new(), - }) - } - - pub fn get_output_status( - &self, - status: &zriver_output_status_v1::ZriverOutputStatusV1, - ) -> Option { - self.output_statuses - .iter() - .filter_map(Weak::upgrade) - .find(|inner| &inner.status == status) - .map(RiverOutputStatus) + let status_manager = globals.bind(qh, 1..=4, ())?; + Ok(Self { status_manager }) } #[must_use = "The output status is destroyed if dropped"] @@ -48,70 +31,37 @@ impl RiverStatusState { + Dispatch + 'static, { - let output_status = - self.status_manager - .get_river_output_status(output, qh, RiverStatusData {}); - - let output_status = RiverOutputStatus(Arc::new(OutputStatusInner { - status: output_status, - })); - - self.output_statuses.push(Arc::downgrade(&output_status.0)); - - output_status + RiverOutputStatus(self.status_manager.get_river_output_status( + output, + qh, + RiverStatusData { + output: output.clone(), + }, + )) } } pub trait RiverStatusHandler: Sized { fn river_status_state(&mut self) -> &mut RiverStatusState; - fn focused_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle, - output_status: &RiverOutputStatus, - focused: u32, - ); + fn focused_tags_updated(&mut self, output: &wl_output::WlOutput, focused: u32); - fn urgent_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle, - output_status: &RiverOutputStatus, - urgent: u32, - ); + fn urgent_tags_updated(&mut self, output: &wl_output::WlOutput, urgent: u32); - fn views_tags_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle, - output_status: &RiverOutputStatus, - tags: Vec, - ); + fn views_tags_updated(&mut self, output: &wl_output::WlOutput, tags: Vec); - fn layout_name_updated( - &mut self, - conn: &Connection, - qh: &QueueHandle, - output_status: &RiverOutputStatus, - layout_name: Option, - ); + fn layout_name_updated(&mut self, output: &wl_output::WlOutput, layout_name: Option); } -#[derive(Debug, Clone)] -pub struct RiverOutputStatus(Arc); +#[derive(Debug)] +pub struct RiverOutputStatus(zriver_output_status_v1::ZriverOutputStatusV1); -impl PartialEq for RiverOutputStatus { - fn eq(&self, other: &Self) -> bool { - Arc::ptr_eq(&self.0, &other.0) +impl Drop for RiverOutputStatus { + fn drop(&mut self) { + self.0.destroy(); } } -#[derive(Debug)] -pub struct RiverStatusData { - // This is empty right now, but may be populated in the future. -} - #[macro_export] macro_rules! delegate_river_status { ($ty: ty) => { @@ -125,14 +75,8 @@ macro_rules! delegate_river_status { } #[derive(Debug)] -struct OutputStatusInner { - status: zriver_output_status_v1::ZriverOutputStatusV1, -} - -impl Drop for OutputStatusInner { - fn drop(&mut self) { - self.status.destroy(); - } +pub struct RiverStatusData { + output: wl_output::WlOutput, } impl Dispatch for RiverStatusState @@ -160,35 +104,26 @@ where { fn event( data: &mut D, - status: &zriver_output_status_v1::ZriverOutputStatusV1, + _: &zriver_output_status_v1::ZriverOutputStatusV1, event: zriver_output_status_v1::Event, - _udata: &RiverStatusData, - conn: &Connection, - qh: &QueueHandle, + udata: &RiverStatusData, + _: &Connection, + _: &QueueHandle, ) { use zriver_output_status_v1::Event; - // Remove any statuses that have been dropped - data.river_status_state() - .output_statuses - .retain(|status| status.upgrade().is_some()); - - if let Some(status) = data.river_status_state().get_output_status(status) { - match event { - Event::FocusedTags { tags } => data.focused_tags_updated(conn, qh, &status, tags), - Event::UrgentTags { tags } => data.urgent_tags_updated(conn, qh, &status, tags), - Event::ViewTags { tags } => { - let tags = tags - .chunks_exact(4) - .map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap())) - .collect(); - data.views_tags_updated(conn, qh, &status, tags); - } - Event::LayoutName { name } => { - data.layout_name_updated(conn, qh, &status, Some(name)) - } - Event::LayoutNameClear => data.layout_name_updated(conn, qh, &status, None), + match event { + Event::FocusedTags { tags } => data.focused_tags_updated(&udata.output, tags), + Event::UrgentTags { tags } => data.urgent_tags_updated(&udata.output, tags), + Event::ViewTags { tags } => { + let tags = tags + .chunks_exact(4) + .map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap())) + .collect(); + data.views_tags_updated(&udata.output, tags); } + Event::LayoutName { name } => data.layout_name_updated(&udata.output, Some(name)), + Event::LayoutNameClear => data.layout_name_updated(&udata.output, None), } } } diff --git a/src/shared_state.rs b/src/shared_state.rs index 554d856..c4ec9d6 100644 --- a/src/shared_state.rs +++ b/src/shared_state.rs @@ -1,7 +1,4 @@ -use smithay_client_toolkit::{ - reexports::client::QueueHandle, - shm::{slot::SlotPool, ShmState}, -}; +use smithay_client_toolkit::{reexports::client::QueueHandle, shm::slot::SlotPool}; use crate::{ config::Config, @@ -13,18 +10,9 @@ use crate::{ #[derive(Debug)] pub struct SharedState { pub qh: QueueHandle, - pub shm_state: ShmState, - pub pool: Option, + pub pool: SlotPool, pub config: Config, pub status_cmd: Option, pub blocks: Vec, pub blocks_cache: Vec, } - -impl SharedState { - pub fn get_pool(&mut self, len: usize) -> &mut SlotPool { - self.pool.get_or_insert_with(|| { - SlotPool::new(len, &self.shm_state).expect("Failed to create pool") - }) - } -} diff --git a/src/state.rs b/src/state.rs index e6cb421..e2e57ee 100644 --- a/src/state.rs +++ b/src/state.rs @@ -18,7 +18,7 @@ use smithay_client_toolkit::{ shell::layer::{ Anchor, Layer, LayerShell, LayerShellHandler, LayerSurface, LayerSurfaceConfigure, }, - shm::{ShmHandler, ShmState}, + shm::{slot::SlotPool, ShmHandler, ShmState}, }; use tokio::io::unix::AsyncFdReadyGuard; use wayland_client::globals::GlobalList; @@ -31,7 +31,7 @@ use crate::{ pointer_btn::PointerBtn, river_protocols::{ control::{RiverControlHandler, RiverControlState}, - status::{RiverOutputStatus, RiverStatusHandler, RiverStatusState}, + status::{RiverStatusHandler, RiverStatusState}, }, shared_state::SharedState, status_cmd::StatusCmd, @@ -40,6 +40,7 @@ use crate::{ pub struct State { registry_state: RegistryState, + shm_state: ShmState, seat_state: SeatState, output_state: OutputState, compositor_state: CompositorState, @@ -79,8 +80,12 @@ impl State { }), }; + let shm_state = ShmState::bind(globals, &qh).unwrap(); + let pool = SlotPool::new(1024, &shm_state).expect("Failed to create pool"); + let mut this = Self { registry_state: RegistryState::new(globals), + shm_state, seat_state: SeatState::new(globals, &qh), output_state: OutputState::new(globals, &qh), compositor_state: CompositorState::bind(globals, &qh).unwrap(), @@ -92,8 +97,7 @@ impl State { bars: Vec::new(), shared_state: SharedState { qh: event_queue.handle(), - shm_state: ShmState::bind(globals, &qh).unwrap(), - pool: None, + pool, config, status_cmd, blocks: Vec::new(), @@ -186,7 +190,7 @@ impl OutputHandler for State { output: wl_output::WlOutput, ) { let height = self.shared_state.config.height; - let surface = self.compositor_state.create_surface(qh).unwrap(); + let surface = self.compositor_state.create_surface(qh); let layer = LayerSurface::builder() .output(&output) .size((0, height)) @@ -199,6 +203,7 @@ impl OutputHandler for State { .as_mut() .map(|s| s.new_output_status(qh, &output)); self.bars.push(Bar { + output, configured: false, width: 0, height, @@ -208,6 +213,7 @@ impl OutputHandler for State { river_output_status, river_control: self.river_control_state.clone(), layout_name: None, + layout_name_computed: None, tags_btns: Default::default(), tags_info: Default::default(), tags_computed: Vec::new(), @@ -275,7 +281,7 @@ impl SeatHandler for State { seat, pointer, themed_pointer, - pointer_surface: self.compositor_state.create_surface(qh).unwrap(), // TODO: make a PR to remove this unwrap + pointer_surface: self.compositor_state.create_surface(qh), finger_scroll: 0.0, }); } @@ -321,7 +327,7 @@ impl PointerHandler for State { .set_cursor( conn, "default", - self.shared_state.shm_state.wl_shm(), + self.shm_state.wl_shm(), &seat.pointer_surface, ) .unwrap(); @@ -382,7 +388,7 @@ impl PointerHandler for State { impl ShmHandler for State { fn shm_state(&mut self) -> &mut ShmState { - &mut self.shared_state.shm_state + &mut self.shm_state } } @@ -391,67 +397,27 @@ impl RiverStatusHandler for State { self.river_status_state.as_mut().unwrap() } - fn focused_tags_updated( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - output_status: &RiverOutputStatus, - focused: u32, - ) { - let bar = self - .bars - .iter_mut() - .find(|b| b.river_output_status.as_ref() == Some(output_status)) - .unwrap(); + fn focused_tags_updated(&mut self, output: &wl_output::WlOutput, focused: u32) { + let bar = self.bars.iter_mut().find(|b| &b.output == output).unwrap(); bar.tags_info.focused = focused; bar.draw(&mut self.shared_state); } - fn urgent_tags_updated( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - output_status: &RiverOutputStatus, - urgent: u32, - ) { - let bar = self - .bars - .iter_mut() - .find(|b| b.river_output_status.as_ref() == Some(output_status)) - .unwrap(); + fn urgent_tags_updated(&mut self, output: &wl_output::WlOutput, urgent: u32) { + let bar = self.bars.iter_mut().find(|b| &b.output == output).unwrap(); bar.tags_info.urgent = urgent; bar.draw(&mut self.shared_state); } - fn views_tags_updated( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - output_status: &RiverOutputStatus, - tags: Vec, - ) { - let bar = self - .bars - .iter_mut() - .find(|b| b.river_output_status.as_ref() == Some(output_status)) - .unwrap(); + fn views_tags_updated(&mut self, output: &wl_output::WlOutput, tags: Vec) { + let bar = self.bars.iter_mut().find(|b| &b.output == output).unwrap(); bar.tags_info.active = tags.into_iter().fold(0, |a, b| a | b); bar.draw(&mut self.shared_state); } - fn layout_name_updated( - &mut self, - _conn: &Connection, - _qh: &QueueHandle, - output_status: &RiverOutputStatus, - layout_name: Option, - ) { - let bar = self - .bars - .iter_mut() - .find(|b| b.river_output_status.as_ref() == Some(output_status)) - .unwrap(); - bar.layout_name = layout_name; + fn layout_name_updated(&mut self, output: &wl_output::WlOutput, layout_name: Option) { + let bar = self.bars.iter_mut().find(|b| &b.output == output).unwrap(); + bar.set_layout_name(layout_name); bar.draw(&mut self.shared_state); } } -- cgit v1.3.1