summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bar.rs37
-rw-r--r--src/main.rs2
-rw-r--r--src/river_protocols/status.rs135
-rw-r--r--src/shared_state.rs16
-rw-r--r--src/state.rs80
5 files changed, 83 insertions, 187 deletions
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<RiverOutputStatus>,
pub river_control: Option<RiverControlState>,
pub layout_name: Option<String>,
+ pub layout_name_computed: Option<ComputedText>,
pub tags_btns: ButtonManager,
pub tags_info: TagsInfo,
pub tags_computed: Vec<ComputedText>,
@@ -50,6 +52,11 @@ impl Bar {
self.river_output_status.is_some()
}
+ pub fn set_layout_name(&mut self, layout_name: Option<String>) {
+ 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<Weak<OutputStatusInner>>,
}
impl RiverStatusState {
@@ -19,22 +16,8 @@ impl RiverStatusState {
where
D: Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> + '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<RiverOutputStatus> {
- 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<zriver_output_status_v1::ZriverOutputStatusV1, RiverStatusData>
+ '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<Self>,
- 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<Self>,
- 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<Self>,
- output_status: &RiverOutputStatus,
- tags: Vec<u32>,
- );
+ fn views_tags_updated(&mut self, output: &wl_output::WlOutput, tags: Vec<u32>);
- fn layout_name_updated(
- &mut self,
- conn: &Connection,
- qh: &QueueHandle<Self>,
- output_status: &RiverOutputStatus,
- layout_name: Option<String>,
- );
+ fn layout_name_updated(&mut self, output: &wl_output::WlOutput, layout_name: Option<String>);
}
-#[derive(Debug, Clone)]
-pub struct RiverOutputStatus(Arc<OutputStatusInner>);
+#[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<D> Dispatch<zriver_status_manager_v1::ZriverStatusManagerV1, (), D> 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<D>,
+ udata: &RiverStatusData,
+ _: &Connection,
+ _: &QueueHandle<D>,
) {
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<State>,
- pub shm_state: ShmState,
- pub pool: Option<SlotPool>,
+ pub pool: SlotPool,
pub config: Config,
pub status_cmd: Option<StatusCmd>,
pub blocks: Vec<Block>,
pub blocks_cache: Vec<ComputedBlock>,
}
-
-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<Self>,
- 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<Self>,
- 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<Self>,
- output_status: &RiverOutputStatus,
- tags: Vec<u32>,
- ) {
- 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<u32>) {
+ 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<Self>,
- output_status: &RiverOutputStatus,
- layout_name: Option<String>,
- ) {
- 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<String>) {
+ let bar = self.bars.iter_mut().find(|b| &b.output == output).unwrap();
+ bar.set_layout_name(layout_name);
bar.draw(&mut self.shared_state);
}
}