1
0
Fork 0
forked from wry/wry

jay_compositior: add get_toplevel request

This commit is contained in:
Julian Orth 2024-10-10 13:51:01 +02:00
parent d4c0fb29ba
commit 4f431eec5c
3 changed files with 54 additions and 21 deletions

View file

@ -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! {

View file

@ -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,

View file

@ -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 {