From a5ecb363fdb2eb3ab543ad56c55c186414500469 Mon Sep 17 00:00:00 2001 From: Jake Stanger Date: Mon, 29 May 2023 14:01:42 +0100 Subject: [PATCH] fix: popups occasionally getting jumbled with multiple bars --- src/bar.rs | 4 +++- src/clients/wayland/wlr_data_control/mod.rs | 10 ++-------- src/clients/wayland/wlr_foreign_toplevel/handle.rs | 10 ++-------- src/main.rs | 1 + src/unique_id.rs | 9 +++++++++ 5 files changed, 17 insertions(+), 17 deletions(-) create mode 100644 src/unique_id.rs diff --git a/src/bar.rs b/src/bar.rs index 052ba41..326764e 100644 --- a/src/bar.rs +++ b/src/bar.rs @@ -3,6 +3,7 @@ use crate::modules::{ create_module, set_widget_identifiers, wrap_widget, ModuleInfo, ModuleLocation, }; use crate::popup::Popup; +use crate::unique_id::get_unique_usize; use crate::Config; use color_eyre::Result; use gtk::gdk::Monitor; @@ -206,7 +207,8 @@ fn add_modules( }}; } - for (id, config) in modules.into_iter().enumerate() { + for config in modules.into_iter() { + let id = get_unique_usize(); match config { #[cfg(feature = "clipboard")] ModuleConfig::Clipboard(mut module) => add_module!(module, id), diff --git a/src/clients/wayland/wlr_data_control/mod.rs b/src/clients/wayland/wlr_data_control/mod.rs index fe9034a..22404b5 100644 --- a/src/clients/wayland/wlr_data_control/mod.rs +++ b/src/clients/wayland/wlr_data_control/mod.rs @@ -7,6 +7,7 @@ use self::device::{DataControlDeviceDataExt, DataControlDeviceHandler}; use self::offer::{DataControlDeviceOffer, DataControlOfferHandler, SelectionOffer}; use self::source::DataControlSourceHandler; use crate::clients::wayland::Environment; +use crate::unique_id::get_unique_usize; use crate::{lock, send}; use device::DataControlDevice; use glib::Bytes; @@ -19,21 +20,14 @@ use std::fmt::{Debug, Formatter}; use std::fs::File; use std::io::{ErrorKind, Read, Write}; use std::os::fd::{AsRawFd, OwnedFd, RawFd}; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Arc; use std::{fs, io}; use tracing::{debug, error, trace}; use wayland_client::{Connection, QueueHandle}; use wayland_protocols_wlr::data_control::v1::client::zwlr_data_control_source_v1::ZwlrDataControlSourceV1; -static COUNTER: AtomicUsize = AtomicUsize::new(1); - const INTERNAL_MIME_TYPE: &str = "x-ironbar-internal"; -fn get_id() -> usize { - COUNTER.fetch_add(1, Ordering::Relaxed) -} - pub struct SelectionOfferItem { offer: SelectionOffer, token: Option, @@ -151,7 +145,7 @@ impl Environment { }; Ok(ClipboardItem { - id: get_id(), + id: get_unique_usize(), value, mime_type: mime_type.value.clone(), }) diff --git a/src/clients/wayland/wlr_foreign_toplevel/handle.rs b/src/clients/wayland/wlr_foreign_toplevel/handle.rs index 2279472..577eb15 100644 --- a/src/clients/wayland/wlr_foreign_toplevel/handle.rs +++ b/src/clients/wayland/wlr_foreign_toplevel/handle.rs @@ -1,7 +1,7 @@ use super::manager::ToplevelManagerState; use crate::lock; +use crate::unique_id::get_unique_usize; use std::collections::HashSet; -use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Mutex}; use tracing::trace; use wayland_client::protocol::wl_output::WlOutput; @@ -11,12 +11,6 @@ use wayland_protocols_wlr::foreign_toplevel::v1::client::zwlr_foreign_toplevel_h Event, ZwlrForeignToplevelHandleV1, }; -static COUNTER: AtomicUsize = AtomicUsize::new(1); - -fn get_id() -> usize { - COUNTER.fetch_add(1, Ordering::Relaxed) -} - #[derive(Debug, Clone)] pub struct ToplevelHandle { pub handle: ZwlrForeignToplevelHandleV1, @@ -74,7 +68,7 @@ pub struct ToplevelInfo { impl Default for ToplevelInfo { fn default() -> Self { Self { - id: get_id(), + id: get_unique_usize(), app_id: String::new(), title: String::new(), fullscreen: false, diff --git a/src/main.rs b/src/main.rs index 951fe22..8523a52 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ mod modules; mod popup; mod script; mod style; +mod unique_id; use crate::bar::create_bar; use crate::config::{Config, MonitorConfig}; diff --git a/src/unique_id.rs b/src/unique_id.rs new file mode 100644 index 0000000..beeddea --- /dev/null +++ b/src/unique_id.rs @@ -0,0 +1,9 @@ +use std::sync::atomic::{AtomicUsize, Ordering}; + +static COUNTER: AtomicUsize = AtomicUsize::new(1); + +/// Gets a `usize` ID value that is unique to the entire Ironbar instance. +/// This is just an `AtomicUsize` that increments every time this function is called. +pub fn get_unique_usize() -> usize { + COUNTER.fetch_add(1, Ordering::Relaxed) +}