foreign-toplevel: store weak references
This commit is contained in:
parent
3f9b75e470
commit
9a084a53aa
3 changed files with 31 additions and 14 deletions
|
|
@ -3,7 +3,7 @@ use {
|
||||||
client::{Client, ClientError},
|
client::{Client, ClientError},
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
tree::ToplevelNode,
|
tree::ToplevelOpt,
|
||||||
wire::{ext_foreign_toplevel_handle_v1::*, ExtForeignToplevelHandleV1Id},
|
wire::{ext_foreign_toplevel_handle_v1::*, ExtForeignToplevelHandleV1Id},
|
||||||
},
|
},
|
||||||
std::rc::Rc,
|
std::rc::Rc,
|
||||||
|
|
@ -14,16 +14,15 @@ pub struct ExtForeignToplevelHandleV1 {
|
||||||
pub id: ExtForeignToplevelHandleV1Id,
|
pub id: ExtForeignToplevelHandleV1Id,
|
||||||
pub client: Rc<Client>,
|
pub client: Rc<Client>,
|
||||||
pub tracker: Tracker<Self>,
|
pub tracker: Tracker<Self>,
|
||||||
pub toplevel: Rc<dyn ToplevelNode>,
|
pub toplevel: ToplevelOpt,
|
||||||
pub version: Version,
|
pub version: Version,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ExtForeignToplevelHandleV1 {
|
impl ExtForeignToplevelHandleV1 {
|
||||||
fn detach(&self) {
|
fn detach(&self) {
|
||||||
self.toplevel
|
if let Some(tl) = self.toplevel.get() {
|
||||||
.tl_data()
|
tl.tl_data().handles.remove(&(self.client.id, self.id));
|
||||||
.handles
|
}
|
||||||
.remove(&(self.client.id, self.id));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ use {
|
||||||
},
|
},
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
tree::{NodeVisitorBase, ToplevelNode},
|
tree::{NodeVisitorBase, ToplevelOpt},
|
||||||
wire::{
|
wire::{
|
||||||
ext_foreign_toplevel_list_v1::*, ExtForeignToplevelHandleV1Id,
|
ext_foreign_toplevel_list_v1::*, ExtForeignToplevelHandleV1Id,
|
||||||
ExtForeignToplevelListV1Id,
|
ExtForeignToplevelListV1Id,
|
||||||
|
|
@ -105,10 +105,7 @@ impl ExtForeignToplevelListV1 {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn publish_toplevel(
|
pub fn publish_toplevel(&self, tl: ToplevelOpt) -> Option<Rc<ExtForeignToplevelHandleV1>> {
|
||||||
&self,
|
|
||||||
tl: &Rc<dyn ToplevelNode>,
|
|
||||||
) -> Option<Rc<ExtForeignToplevelHandleV1>> {
|
|
||||||
let id: ExtForeignToplevelHandleV1Id = match self.client.new_id() {
|
let id: ExtForeignToplevelHandleV1Id = match self.client.new_id() {
|
||||||
Ok(i) => i,
|
Ok(i) => i,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
|
|
@ -120,7 +117,7 @@ impl ExtForeignToplevelListV1 {
|
||||||
id,
|
id,
|
||||||
client: self.client.clone(),
|
client: self.client.clone(),
|
||||||
tracker: Default::default(),
|
tracker: Default::default(),
|
||||||
toplevel: tl.clone(),
|
toplevel: tl,
|
||||||
version: self.version,
|
version: self.version,
|
||||||
});
|
});
|
||||||
track!(self.client, handle);
|
track!(self.client, handle);
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ use {
|
||||||
std::{
|
std::{
|
||||||
cell::{Cell, RefCell},
|
cell::{Cell, RefCell},
|
||||||
ops::Deref,
|
ops::Deref,
|
||||||
rc::Rc,
|
rc::{Rc, Weak},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -226,6 +226,23 @@ pub struct FullscreenedData {
|
||||||
pub workspace: Rc<WorkspaceNode>,
|
pub workspace: Rc<WorkspaceNode>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct ToplevelOpt {
|
||||||
|
toplevel: Weak<dyn ToplevelNode>,
|
||||||
|
identifier: ToplevelIdentifier,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToplevelOpt {
|
||||||
|
pub fn get(&self) -> Option<Rc<dyn ToplevelNode>> {
|
||||||
|
let tl = self.toplevel.upgrade()?;
|
||||||
|
if tl.tl_data().identifier.get() == self.identifier {
|
||||||
|
Some(tl)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct ToplevelData {
|
pub struct ToplevelData {
|
||||||
pub self_active: Cell<bool>,
|
pub self_active: Cell<bool>,
|
||||||
pub client: Option<Rc<Client>>,
|
pub client: Option<Rc<Client>>,
|
||||||
|
|
@ -372,7 +389,11 @@ impl ToplevelData {
|
||||||
title: &str,
|
title: &str,
|
||||||
app_id: &str,
|
app_id: &str,
|
||||||
) {
|
) {
|
||||||
let handle = match list.publish_toplevel(toplevel) {
|
let opt = ToplevelOpt {
|
||||||
|
toplevel: Rc::downgrade(toplevel),
|
||||||
|
identifier: self.identifier.get(),
|
||||||
|
};
|
||||||
|
let handle = match list.publish_toplevel(opt) {
|
||||||
None => return,
|
None => return,
|
||||||
Some(handle) => handle,
|
Some(handle) => handle,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue