use crate::clients::clipboard::{self, ClipboardEvent}; use crate::clients::wayland::{ClipboardItem, ClipboardValue}; use crate::config::{CommonConfig, TruncateMode}; use crate::image::new_icon_button; use crate::modules::{ Module, ModuleInfo, ModuleParts, ModulePopup, ModuleUpdateEvent, PopupButton, WidgetContext, }; use crate::{glib_recv, module_impl, spawn, try_send}; use glib::Propagation; use gtk::gdk_pixbuf::Pixbuf; use gtk::gio::{Cancellable, MemoryInputStream}; use gtk::prelude::*; use gtk::{Button, EventBox, Image, Label, Orientation, RadioButton, Widget}; use serde::Deserialize; use std::collections::HashMap; use std::sync::Arc; use tokio::sync::{broadcast, mpsc}; use tracing::{debug, error}; #[derive(Debug, Deserialize, Clone)] pub struct ClipboardModule { #[serde(default = "default_icon")] icon: String, #[serde(default = "default_icon_size")] icon_size: i32, #[serde(default = "default_max_items")] max_items: usize, // -- Common -- truncate: Option, #[serde(flatten)] pub common: Option, } fn default_icon() -> String { String::from("󰨸") } const fn default_icon_size() -> i32 { 32 } const fn default_max_items() -> usize { 10 } #[derive(Debug, Clone)] pub enum ControllerEvent { Add(usize, ClipboardItem), Remove(usize), Activate(usize), Deactivate, } #[derive(Debug, Clone)] pub enum UIEvent { Copy(usize), Remove(usize), } impl Module