jay_compositior: add get_toplevel request
This commit is contained in:
parent
d4c0fb29ba
commit
4f431eec5c
3 changed files with 54 additions and 21 deletions
|
|
@ -23,12 +23,12 @@ use {
|
||||||
leaks::Tracker,
|
leaks::Tracker,
|
||||||
object::{Object, Version},
|
object::{Object, Version},
|
||||||
screenshoter::take_screenshot,
|
screenshoter::take_screenshot,
|
||||||
utils::errorfmt::ErrorFmt,
|
utils::{errorfmt::ErrorFmt, toplevel_identifier::ToplevelIdentifier},
|
||||||
wire::{jay_compositor::*, JayCompositorId, JayScreenshotId},
|
wire::{jay_compositor::*, JayCompositorId, JayScreenshotId},
|
||||||
},
|
},
|
||||||
bstr::ByteSlice,
|
bstr::ByteSlice,
|
||||||
log::Level,
|
log::Level,
|
||||||
std::{cell::Cell, ops::Deref, rc::Rc},
|
std::{cell::Cell, ops::Deref, rc::Rc, str::FromStr},
|
||||||
thiserror::Error,
|
thiserror::Error,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -364,13 +364,7 @@ impl JayCompositorRequestHandler for JayCompositor {
|
||||||
|
|
||||||
fn select_toplevel(&self, req: SelectToplevel, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
fn select_toplevel(&self, req: SelectToplevel, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||||
let seat = self.client.lookup(req.seat)?;
|
let seat = self.client.lookup(req.seat)?;
|
||||||
let obj = Rc::new(JaySelectToplevel {
|
let obj = JaySelectToplevel::new(&self.client, req.id, self.version);
|
||||||
id: req.id,
|
|
||||||
client: self.client.clone(),
|
|
||||||
tracker: Default::default(),
|
|
||||||
destroyed: Cell::new(false),
|
|
||||||
version: self.version,
|
|
||||||
});
|
|
||||||
track!(self.client, obj);
|
track!(self.client, obj);
|
||||||
self.client.add_client_obj(&obj)?;
|
self.client.add_client_obj(&obj)?;
|
||||||
let selector = JayToplevelSelector {
|
let selector = JayToplevelSelector {
|
||||||
|
|
@ -423,6 +417,26 @@ impl JayCompositorRequestHandler for JayCompositor {
|
||||||
self.client.add_client_obj(&obj)?;
|
self.client.add_client_obj(&obj)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_toplevel(&self, req: GetToplevel<'_>, _slf: &Rc<Self>) -> Result<(), Self::Error> {
|
||||||
|
let obj = JaySelectToplevel::new(&self.client, req.id, self.version);
|
||||||
|
track!(self.client, obj);
|
||||||
|
self.client.add_client_obj(&obj)?;
|
||||||
|
let tl = match ToplevelIdentifier::from_str(req.toplevel_id) {
|
||||||
|
Ok(id) => self
|
||||||
|
.client
|
||||||
|
.state
|
||||||
|
.toplevels
|
||||||
|
.get(&id)
|
||||||
|
.and_then(|w| w.upgrade()),
|
||||||
|
Err(e) => {
|
||||||
|
log::error!("Could not parse toplevel id: {}", ErrorFmt(e));
|
||||||
|
None
|
||||||
|
}
|
||||||
|
};
|
||||||
|
obj.done(tl);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object_base! {
|
object_base! {
|
||||||
|
|
|
||||||
|
|
@ -39,26 +39,32 @@ impl Drop for JayToplevelSelector {
|
||||||
if self.jst.destroyed.get() {
|
if self.jst.destroyed.get() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let jtl = match self.tl.take() {
|
self.jst.done(self.tl.take());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl JaySelectToplevel {
|
||||||
|
pub fn done(&self, tl: Option<Rc<dyn ToplevelNode>>) {
|
||||||
|
let jtl = match tl {
|
||||||
None => None,
|
None => None,
|
||||||
Some(toplevel) => {
|
Some(toplevel) => {
|
||||||
let id = match self.jst.client.new_id() {
|
let id = match self.client.new_id() {
|
||||||
Ok(id) => id,
|
Ok(id) => id,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
self.jst.client.error(e);
|
self.client.error(e);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let jtl = Rc::new(JayToplevel {
|
let jtl = Rc::new(JayToplevel {
|
||||||
id,
|
id,
|
||||||
client: self.jst.client.clone(),
|
client: self.client.clone(),
|
||||||
tracker: Default::default(),
|
tracker: Default::default(),
|
||||||
toplevel,
|
toplevel,
|
||||||
destroyed: Cell::new(false),
|
destroyed: Cell::new(false),
|
||||||
version: self.jst.version,
|
version: self.version,
|
||||||
});
|
});
|
||||||
track!(self.jst.client, jtl);
|
track!(self.client, jtl);
|
||||||
self.jst.client.add_server_obj(&jtl);
|
self.client.add_server_obj(&jtl);
|
||||||
jtl.toplevel
|
jtl.toplevel
|
||||||
.tl_data()
|
.tl_data()
|
||||||
.jay_toplevels
|
.jay_toplevels
|
||||||
|
|
@ -67,20 +73,28 @@ impl Drop for JayToplevelSelector {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
match jtl {
|
match jtl {
|
||||||
None => self.jst.send_done(JayToplevelId::NONE),
|
None => self.send_done(JayToplevelId::NONE),
|
||||||
Some(jtl) => {
|
Some(jtl) => {
|
||||||
self.jst.send_done(jtl.id);
|
self.send_done(jtl.id);
|
||||||
if jtl.version >= ID_SINCE {
|
if jtl.version >= ID_SINCE {
|
||||||
jtl.send_id();
|
jtl.send_id();
|
||||||
jtl.send_done();
|
jtl.send_done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let _ = self.jst.client.remove_obj(&*self.jst);
|
let _ = self.client.remove_obj(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new(client: &Rc<Client>, id: JaySelectToplevelId, version: Version) -> Rc<Self> {
|
||||||
|
Rc::new(JaySelectToplevel {
|
||||||
|
id,
|
||||||
|
client: client.clone(),
|
||||||
|
tracker: Default::default(),
|
||||||
|
destroyed: Cell::new(false),
|
||||||
|
version,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl JaySelectToplevel {
|
|
||||||
fn send_done(&self, id: JayToplevelId) {
|
fn send_done(&self, id: JayToplevelId) {
|
||||||
self.client.event(Done {
|
self.client.event(Done {
|
||||||
self_id: self.id,
|
self_id: self.id,
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,11 @@ request get_xwayland (since = 11) {
|
||||||
id: id(jay_xwayland),
|
id: id(jay_xwayland),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
request get_toplevel (since = 12) {
|
||||||
|
id: id(jay_select_toplevel),
|
||||||
|
toplevel_id: str,
|
||||||
|
}
|
||||||
|
|
||||||
# events
|
# events
|
||||||
|
|
||||||
event client_id {
|
event client_id {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue