diff --git a/src/shell/element/stack.rs b/src/shell/element/stack.rs index b1a6d9e1..74c95599 100644 --- a/src/shell/element/stack.rs +++ b/src/shell/element/stack.rs @@ -590,10 +590,16 @@ impl Program for CosmicStackInternal { .into(), CosmicElement::new( Tabs::new( - windows - .iter() - .enumerate() - .map(|(i, w)| Tab::new(w.title(), w.app_id()).on_close(Message::Close(i))), + windows.iter().enumerate().map(|(i, w)| { + let user_data = w.user_data(); + user_data.insert_if_missing(Id::unique); + Tab::new( + w.title(), + w.app_id(), + user_data.get::().unwrap().clone(), + ) + .on_close(Message::Close(i)) + }), active, windows[active].is_activated(false), group_focused, diff --git a/src/shell/element/stack/tab.rs b/src/shell/element/stack/tab.rs index 3874a9ba..3c955fdd 100644 --- a/src/shell/element/stack/tab.rs +++ b/src/shell/element/stack/tab.rs @@ -14,7 +14,7 @@ use cosmic::{ widget::{ operation::{Operation, OperationOutputWrapper}, tree::Tree, - Widget, + Id, Widget, }, Clipboard, Color, Length, Rectangle, Shell, Size, }, @@ -114,6 +114,7 @@ pub trait TabMessage { } pub struct Tab<'a, Message: TabMessage> { + id: Id, app_icon: Icon<'a>, title: String, font: Font, @@ -124,8 +125,9 @@ pub struct Tab<'a, Message: TabMessage> { } impl<'a, Message: TabMessage> Tab<'a, Message> { - pub fn new(title: impl Into, app_id: impl Into) -> Self { + pub fn new(title: impl Into, app_id: impl Into, id: Id) -> Self { Tab { + id, app_icon: icon(app_id.into(), 16), title: title.into(), font: cosmic::font::FONT, @@ -223,6 +225,7 @@ impl<'a, Message: TabMessage> Tab<'a, Message> { ); TabInternal { + id: self.id, idx, active: self.active, background: self.background_theme.into(), @@ -239,6 +242,7 @@ const TEXT_BREAKPOINT: i32 = 44; const CLOSE_BREAKPOINT: i32 = 125; pub(super) struct TabInternal<'a, Message: TabMessage, Renderer> { + id: Id, idx: usize, active: bool, background: theme::Container, @@ -251,6 +255,10 @@ where Renderer::Theme: ContainerStyleSheet