diff --git a/src/bar.rs b/src/bar.rs index 326764e..fc47fab 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -207,7 +207,7 @@ fn add_modules( }}; } - for config in modules.into_iter() { + for config in modules { let id = get_unique_usize(); match config { #[cfg(feature = "clipboard")] diff --git a/src/clients/clipboard.rs b/src/clients/clipboard.rs index cadbae1..fb2623c 100644 --- a/src/clients/clipboard.rs +++ b/src/clients/clipboard.rs @@ -38,7 +38,8 @@ impl ClipboardClient { spawn(async move { let (mut rx, item) = { - let wl = wayland::get_client().await; + let wl = wayland::get_client(); + let wl = lock!(wl); wl.subscribe_clipboard() }; @@ -111,7 +112,7 @@ impl ClipboardClient { rx } - pub async fn copy(&self, id: usize) { + pub fn copy(&self, id: usize) { debug!("Copying item with id {id}"); let item = { @@ -120,7 +121,8 @@ impl ClipboardClient { }; if let Some(item) = item { - let wl = wayland::get_client().await; + let wl = wayland::get_client(); + let wl = lock!(wl); wl.copy_to_clipboard(item); } diff --git a/src/clients/system_tray.rs b/src/clients/system_tray.rs index 36c4002..9375453 100644 --- a/src/clients/system_tray.rs +++ b/src/clients/system_tray.rs @@ -31,7 +31,7 @@ impl TrayEventReceiver { let (b_tx, b_rx) = broadcast::channel(16); let tray = StatusNotifierWatcher::new(rx).await?; - let mut host = tray.create_notifier_host(&id).await?; + let mut host = Box::pin(tray.create_notifier_host(&id)).await?; let tray = Arc::new(Mutex::new(BTreeMap::new())); @@ -106,7 +106,7 @@ lazy_static! { let value = loop { retries += 1; - let tray = TrayEventReceiver::new().await; + let tray = Box::pin(TrayEventReceiver::new()).await; match tray { Ok(tray) => break Some(tray), diff --git a/src/clients/upower.rs b/src/clients/upower.rs index f636ecb..895b9ce 100644 --- a/src/clients/upower.rs +++ b/src/clients/upower.rs @@ -6,7 +6,7 @@ use zbus::fdo::PropertiesProxy; lazy_static! { static ref DISPLAY_PROXY: AsyncOnce>> = AsyncOnce::new(async { - let dbus = zbus::Connection::system() + let dbus = Box::pin(zbus::Connection::system()) .await .expect("failed to create connection to system bus"); diff --git a/src/clients/wayland/client.rs b/src/clients/wayland/client.rs index 9f506fb..5c16348 100644 --- a/src/clients/wayland/client.rs +++ b/src/clients/wayland/client.rs @@ -71,7 +71,7 @@ pub struct WaylandClient { } impl WaylandClient { - pub(super) async fn new() -> Self { + pub(super) fn new() -> Self { let (toplevel_tx, toplevel_rx) = broadcast::channel(32); let (toplevel_init_tx, toplevel_init_rx) = mpsc::channel(); diff --git a/src/clients/wayland/macros.rs b/src/clients/wayland/macros.rs index 9325d2a..1209e28 100644 --- a/src/clients/wayland/macros.rs +++ b/src/clients/wayland/macros.rs @@ -1,6 +1,6 @@ /// It is necessary to store macros in a separate file due to a compilation error. /// I believe this stems from the feature flags. -/// Related issue: https://github.com/rust-lang/rust/issues/81066 +/// Related issue: // --- Data Control Device --- \\ diff --git a/src/clients/wayland/mod.rs b/src/clients/wayland/mod.rs index a6ef58a..faf5d6c 100644 --- a/src/clients/wayland/mod.rs +++ b/src/clients/wayland/mod.rs @@ -7,7 +7,6 @@ mod wlr_foreign_toplevel; use self::wlr_foreign_toplevel::manager::ToplevelManagerState; use crate::{delegate_foreign_toplevel_handle, delegate_foreign_toplevel_manager}; -use async_once::AsyncOnce; use cfg_if::cfg_if; use lazy_static::lazy_static; use smithay_client_toolkit::output::OutputState; @@ -18,6 +17,7 @@ use smithay_client_toolkit::{ delegate_output, delegate_registry, delegate_seat, registry_handlers, }; use std::collections::HashMap; +use std::sync::{Arc, Mutex}; use tokio::sync::broadcast; use wayland_client::protocol::wl_seat::WlSeat; @@ -33,7 +33,6 @@ cfg_if! { use self::wlr_data_control::manager::DataControlDeviceManagerState; use self::wlr_data_control::source::CopyPasteSource; use self::wlr_data_control::SelectionOfferItem; - use std::sync::{Arc, Mutex}; pub use wlr_data_control::{ClipboardItem, ClipboardValue}; @@ -106,10 +105,9 @@ impl ProvidesRegistryState for Environment { } lazy_static! { - static ref CLIENT: AsyncOnce = - AsyncOnce::new(async { WaylandClient::new().await }); + static ref CLIENT: Arc> = Arc::new(Mutex::new(WaylandClient::new())); } -pub async fn get_client() -> &'static WaylandClient { - CLIENT.get().await +pub fn get_client() -> Arc> { + CLIENT.clone() } diff --git a/src/clients/wayland/wlr_data_control/mod.rs b/src/clients/wayland/wlr_data_control/mod.rs index 22404b5..afe1989 100644 --- a/src/clients/wayland/wlr_data_control/mod.rs +++ b/src/clients/wayland/wlr_data_control/mod.rs @@ -291,14 +291,14 @@ impl DataControlSourceHandler for Environment { let mut events = (0..16).map(|_| EpollEvent::empty()).collect::>(); let mut epoll_event = EpollEvent::new(EpollFlags::EPOLLOUT, 0); - let epoll_fd = epoll_create().unwrap(); + let epoll_fd = epoll_create().expect("to get valid file descriptor"); epoll_ctl( epoll_fd, EpollOp::EpollCtlAdd, fd.as_raw_fd(), &mut epoll_event, ) - .unwrap(); + .expect("to send valid epoll operation"); while !bytes.is_empty() { let chunk = &bytes[..min(pipe_size as usize, bytes.len())]; diff --git a/src/clients/wayland/wlr_foreign_toplevel/handle.rs b/src/clients/wayland/wlr_foreign_toplevel/handle.rs index 577eb15..08ac93c 100644 --- a/src/clients/wayland/wlr_foreign_toplevel/handle.rs +++ b/src/clients/wayland/wlr_foreign_toplevel/handle.rs @@ -151,9 +151,8 @@ where lock!(data.inner).current_info = Some(pending_info); } - if !lock!(data.inner).initial_done { - lock!(data.inner).initial_done = true; - state.new_handle( + if lock!(data.inner).initial_done { + state.update_handle( conn, qh, ToplevelHandle { @@ -161,7 +160,8 @@ where }, ); } else { - state.update_handle( + lock!(data.inner).initial_done = true; + state.new_handle( conn, qh, ToplevelHandle { diff --git a/src/main.rs b/src/main.rs index 6cd5022..8f364bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,7 +46,7 @@ use tokio::runtime::Handle; use tokio::task::{block_in_place, spawn_blocking}; use crate::error::ExitCode; -use clients::wayland::{self, WaylandClient}; +use clients::wayland; use tracing::{debug, error, info}; use universal_config::ConfigLoader; @@ -59,9 +59,9 @@ async fn main() { cfg_if! { if #[cfg(feature = "cli")] { - run_with_args().await + run_with_args().await; } else { - start_ironbar().await + start_ironbar().await; } } } @@ -78,16 +78,14 @@ async fn run_with_args() { Err(err) => error!("{err:?}"), }; } - None => start_ironbar().await, + None => start_ironbar(), } } -async fn start_ironbar() { +fn start_ironbar() { info!("Ironbar version {}", VERSION); info!("Starting application"); - let wayland_client = wayland::get_client().await; - let app = Application::builder().application_id(GTK_APP_ID).build(); let running = Rc::new(Cell::new(false)); @@ -141,7 +139,7 @@ async fn start_ironbar() { } } - if let Err(err) = create_bars(app, &display, wayland_client, &config) { + if let Err(err) = create_bars(app, &display, &config) { error!("{:?}", err); exit(ExitCode::CreateBars as i32); } @@ -189,13 +187,9 @@ async fn start_ironbar() { } /// Creates each of the bars across each of the (configured) outputs. -fn create_bars( - app: &Application, - display: &Display, - wl: &WaylandClient, - config: &Config, -) -> Result<()> { - let outputs = wl.get_outputs(); +fn create_bars(app: &Application, display: &Display, config: &Config) -> Result<()> { + let wl = wayland::get_client(); + let outputs = lock!(wl).get_outputs(); debug!("Received {} outputs from Wayland", outputs.len()); debug!("Outputs: {:?}", outputs); diff --git a/src/modules/clipboard.rs b/src/modules/clipboard.rs index 9033878..1ac2966 100644 --- a/src/modules/clipboard.rs +++ b/src/modules/clipboard.rs @@ -111,7 +111,7 @@ impl Module