1
0
Fork 0
forked from wry/wry

autocommit 2022-04-20 14:58:34 CEST

This commit is contained in:
Julian Orth 2022-04-20 14:58:34 +02:00
parent c1773c0fee
commit fa1ec0b36c
22 changed files with 583 additions and 185 deletions

View file

@ -114,7 +114,7 @@ impl XdgSurface {
fn set_absolute_desired_extents(&self, ext: &Rect) {
let prev = self.absolute_desired_extents.replace(*ext);
if ext.x1() != prev.x1() || ext.y1() != prev.y1() {
if ext.position() != prev.position() {
let (mut x1, mut y1) = (ext.x1(), ext.y1());
if let Some(geo) = self.geometry.get() {
x1 -= geo.x1();
@ -303,7 +303,7 @@ impl XdgSurface {
fn set_visible(&self, visible: bool) {
self.surface.node_set_visible(visible);
for popup in self.popups.lock().values() {
popup.node_set_visible(visible);
popup.set_visible(visible);
}
}
}

View file

@ -299,7 +299,7 @@ impl SizedNode for XdgPopup {
}
fn set_visible(&self, visible: bool) {
log::info!("set visible = {}", visible);
// log::info!("set visible = {}", visible);
self.xdg.set_visible(visible);
self.xdg.seat_state.set_visible(self, visible);
}
@ -369,7 +369,7 @@ impl XdgSurfaceExt for XdgPopup {
*wl = Some(ws.stacked.add_last(self.clone()));
*dl = Some(state.root.stacked.add_last(self.clone()));
state.tree_changed();
self.node_set_visible(
self.set_visible(
self.parent
.get()
.map(|p| p.surface.visible.get())
@ -380,8 +380,8 @@ impl XdgSurfaceExt for XdgPopup {
if wl.take().is_some() {
drop(wl);
drop(dl);
self.node_set_visible(false);
self.node_destroy(true);
self.set_visible(false);
self.destroy_node(true);
self.send_popup_done();
}
}

View file

@ -38,6 +38,7 @@ use {
},
thiserror::Error,
};
use crate::tree::{FullscreenData, SizedFullscreenNode};
#[derive(Copy, Clone, Debug, FromPrimitive)]
pub enum ResizeEdge {
@ -88,6 +89,7 @@ pub struct XdgToplevel {
title: RefCell<String>,
pub tracker: Tracker<Self>,
toplevel_data: ToplevelData,
fullscreen_data: FullscreenData,
}
impl Debug for XdgToplevel {
@ -120,9 +122,16 @@ impl XdgToplevel {
title: RefCell::new("".to_string()),
tracker: Default::default(),
toplevel_data: Default::default(),
fullscreen_data: Default::default(),
}
}
fn send_current_configure(&self) {
let rect = self.xdg.absolute_desired_extents.get();
self.send_configure_checked(rect.width(), rect.height());
self.xdg.do_send_configure();
}
fn send_configure_checked(&self, mut width: i32, mut height: i32) {
width = width.max(1);
height = height.max(1);
@ -204,6 +213,7 @@ impl XdgToplevel {
if let Some(parent) = self.parent_node.get() {
parent.node_child_title_changed(self, &title);
}
self.fullscreen_data.set_title(&title);
Ok(())
}
@ -280,21 +290,34 @@ impl XdgToplevel {
Ok(())
}
fn set_fullscreen(&self, parser: MsgParser<'_, '_>) -> Result<(), SetFullscreenError> {
let _req: SetFullscreen = self.xdg.surface.client.parse(self, parser)?;
self.states.borrow_mut().insert(STATE_FULLSCREEN);
let rect = self.xdg.absolute_desired_extents.get();
self.send_configure_checked(rect.width(), rect.height());
self.xdg.do_send_configure();
fn set_fullscreen(self: &Rc<Self>, parser: MsgParser<'_, '_>) -> Result<(), SetFullscreenError> {
let client = &self.xdg.surface.client;
let req: SetFullscreen = client.parse(self.deref(), parser)?;
'set_fullscreen: {
let output = if req.output.is_some() {
match client.lookup(req.output)?.global.node.get() {
Some(node) => node,
_ => {
log::error!("Output global has no node attached");
break 'set_fullscreen;
},
}
} else if let Some(ws) = self.xdg.workspace.get() {
ws.output.get()
} else {
break 'set_fullscreen;
};
client.state.set_fullscreen(self.clone(), &output);
}
self.send_current_configure();
Ok(())
}
fn unset_fullscreen(&self, parser: MsgParser<'_, '_>) -> Result<(), UnsetFullscreenError> {
let _req: UnsetFullscreen = self.xdg.surface.client.parse(self, parser)?;
fn unset_fullscreen(self: &Rc<Self>, parser: MsgParser<'_, '_>) -> Result<(), UnsetFullscreenError> {
let _req: UnsetFullscreen = self.xdg.surface.client.parse(self.deref(), parser)?;
self.states.borrow_mut().remove(&STATE_FULLSCREEN);
let rect = self.xdg.absolute_desired_extents.get();
self.send_configure_checked(rect.width(), rect.height());
self.xdg.do_send_configure();
self.xdg.surface.client.state.unset_fullscreen(self.clone());
self.send_current_configure();
Ok(())
}
@ -408,6 +431,10 @@ impl SizedNode for XdgToplevel {
}
fn set_visible(&self, visible: bool) {
// log::info!("set_visible {}", visible);
// if !visible {
// log::info!("\n{:?}", Backtrace::new());
// }
self.xdg.set_visible(visible);
self.xdg.seat_state.set_visible(self, visible);
}
@ -416,21 +443,11 @@ impl SizedNode for XdgToplevel {
self.xdg.workspace.get()
}
fn is_contained_in(&self, other: NodeId) -> bool {
if let Some(parent) = self.parent_node.get() {
if parent.node_id() == other {
return true;
}
return parent.node_is_contained_in(other);
}
false
}
fn do_focus(self: &Rc<Self>, seat: &Rc<WlSeatGlobal>, _direction: Direction) {
seat.focus_toplevel(self.clone());
}
fn close(&self) {
fn close(self: &Rc<Self>) {
self.send_close();
}
@ -483,6 +500,20 @@ impl SizedNode for XdgToplevel {
fn client(&self) -> Option<Rc<Client>> {
Some(self.xdg.surface.client.clone())
}
fn toggle_floating(self: &Rc<Self>, _seat: &Rc<WlSeatGlobal>) {
let parent = match self.parent_node.get() {
Some(p) => p,
_ => return,
};
if parent.node_is_float() {
parent.node_remove_child2(self.deref(), true);
self.map_tiled();
} else if let Some(ws) = self.xdg.workspace.get() {
parent.node_remove_child2(self.deref(), true);
self.map_floating(&ws);
}
}
}
impl ToplevelNode for XdgToplevel {
@ -502,8 +533,8 @@ impl ToplevelNode for XdgToplevel {
true
}
fn default_surface(&self) -> Rc<WlSurface> {
self.xdg.surface.clone()
fn default_surface(&self) -> Option<Rc<WlSurface>> {
Some(self.xdg.surface.clone())
}
fn set_active(&self, active: bool) {
@ -527,24 +558,6 @@ impl ToplevelNode for XdgToplevel {
fn activate(&self) {
// nothing
}
fn toggle_floating(self: Rc<Self>) {
let parent = match self.parent_node.get() {
Some(p) => p,
_ => return,
};
if parent.node_is_float() {
parent.node_remove_child(&*self);
self.map_tiled();
} else if let Some(ws) = self.xdg.workspace.get() {
parent.node_remove_child(&*self);
self.map_floating(&ws);
}
}
fn close(&self) {
self.send_close();
}
}
impl XdgSurfaceExt for XdgToplevel {
@ -601,6 +614,24 @@ impl XdgSurfaceExt for XdgToplevel {
}
}
impl SizedFullscreenNode for XdgToplevel {
fn data(&self) -> &FullscreenData {
&self.fullscreen_data
}
fn on_set_fullscreen(&self, _workspace: &Rc<WorkspaceNode>) {
self.states.borrow_mut().insert(STATE_FULLSCREEN);
}
fn on_unset_fullscreen(&self) {
// nothing
}
fn title(&self) -> String {
self.title.borrow_mut().clone()
}
}
#[derive(Debug, Error)]
pub enum XdgToplevelError {
#[error("Could not process `destroy` request")]

View file

@ -379,21 +379,11 @@ impl SizedNode for Xwindow {
self.workspace.get()
}
fn is_contained_in(&self, other: NodeId) -> bool {
if let Some(parent) = self.parent_node.get() {
if parent.node_id() == other {
return true;
}
return parent.node_is_contained_in(other);
}
false
}
fn do_focus(self: &Rc<Self>, seat: &Rc<WlSeatGlobal>, _direction: Direction) {
seat.focus_toplevel(self.clone());
}
fn close(&self) {
fn close(self: &Rc<Self>) {
self.data
.state
.xwayland
@ -465,6 +455,23 @@ impl SizedNode for Xwindow {
fn client(&self) -> Option<Rc<Client>> {
Some(self.data.client.clone())
}
fn toggle_floating(self: &Rc<Self>, _seat: &Rc<WlSeatGlobal>) {
let parent = match self.parent_node.get() {
Some(p) => p,
_ => return,
};
if parent.node_is_float() {
parent.node_remove_child2(self.deref(), true);
self.data.state.map_tiled(self.clone());
} else if let Some(ws) = self.workspace.get() {
parent.node_remove_child2(self.deref(), true);
let (width, height) = self.toplevel_data.float_size(&ws);
self.data
.state
.map_floating(self.clone(), width, height, &ws);
}
}
}
impl ToplevelNode for Xwindow {
@ -485,8 +492,8 @@ impl ToplevelNode for Xwindow {
&& self.data.info.input_model.get() != XInputModel::None
}
fn default_surface(&self) -> Rc<WlSurface> {
self.surface.clone()
fn default_surface(&self) -> Option<Rc<WlSurface>> {
Some(self.surface.clone())
}
fn set_active(&self, active: bool) {
@ -502,31 +509,6 @@ impl ToplevelNode for Xwindow {
.queue
.push(XWaylandEvent::Activate(self.data.clone()));
}
fn toggle_floating(self: Rc<Self>) {
let parent = match self.parent_node.get() {
Some(p) => p,
_ => return,
};
if parent.node_is_float() {
parent.node_remove_child(&*self);
self.data.state.map_tiled(self.clone());
} else if let Some(ws) = self.workspace.get() {
parent.node_remove_child(&*self);
let (width, height) = self.toplevel_data.float_size(&ws);
self.data
.state
.map_floating(self.clone(), width, height, &ws);
}
}
fn close(&self) {
self.data
.state
.xwayland
.queue
.push(XWaylandEvent::Close(self.data.clone()));
}
}
#[derive(Debug, Error)]