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, ModuleUpdateEvent, ModuleWidget, WidgetContext}; use crate::popup::Popup; use crate::try_send; 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::spawn; use tokio::sync::mpsc::{Receiver, Sender}; 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, Arc), Remove(usize), Activate(usize), Deactivate, } #[derive(Debug, Clone)] pub enum UIEvent { Copy(usize), Remove(usize), } impl Module