From d8666b484e02702a34f8cc218d19bffc16068936 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 22 May 2024 12:54:18 +0200 Subject: [PATCH 1/4] portal: handle surface scale and transform events --- src/wl_usr/usr_ifs/usr_wl_surface.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/wl_usr/usr_ifs/usr_wl_surface.rs b/src/wl_usr/usr_ifs/usr_wl_surface.rs index f035ccde..c8b3874d 100644 --- a/src/wl_usr/usr_ifs/usr_wl_surface.rs +++ b/src/wl_usr/usr_ifs/usr_wl_surface.rs @@ -51,6 +51,16 @@ impl UsrWlSurface { let _ev: Leave = self.con.parse(self, parser)?; Ok(()) } + + fn preferred_buffer_scale(&self, parser: MsgParser<'_, '_>) -> Result<(), MsgParserError> { + let _ev: PreferredBufferScale = self.con.parse(self, parser)?; + Ok(()) + } + + fn preferred_buffer_transform(&self, parser: MsgParser<'_, '_>) -> Result<(), MsgParserError> { + let _ev: PreferredBufferTransform = self.con.parse(self, parser)?; + Ok(()) + } } usr_object_base! { @@ -58,6 +68,8 @@ usr_object_base! { ENTER => enter, LEAVE => leave, + PREFERRED_BUFFER_SCALE => preferred_buffer_scale, + PREFERRED_BUFFER_TRANSFORM => preferred_buffer_transform, } impl UsrObject for UsrWlSurface { From 04b03272d698ddfc47ed529d3c7c1364a0a07f3e Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 22 May 2024 13:04:53 +0200 Subject: [PATCH 2/4] renderer: use correct scaling for toplevel highlights --- src/renderer.rs | 2 +- src/renderer/renderer_base.rs | 15 +++++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/renderer.rs b/src/renderer.rs index b6901070..65523672 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -368,7 +368,7 @@ impl Renderer<'_> { return; }; let color = self.state.theme.colors.highlight.get(); - self.base.fill_boxes(slice::from_ref(bounds), &color); + self.base.fill_scaled_boxes(slice::from_ref(bounds), &color); } pub fn render_surface(&mut self, surface: &WlSurface, x: i32, y: i32, bounds: Option<&Rect>) { diff --git a/src/renderer/renderer_base.rs b/src/renderer/renderer_base.rs index e29190ac..b61af34a 100644 --- a/src/renderer/renderer_base.rs +++ b/src/renderer/renderer_base.rs @@ -66,17 +66,28 @@ impl RendererBase<'_> { rect } + pub fn fill_scaled_boxes(&mut self, boxes: &[Rect], color: &Color) { + self.fill_boxes3(boxes, color, 0, 0, true); + } + pub fn fill_boxes(&mut self, boxes: &[Rect], color: &Color) { - self.fill_boxes2(boxes, color, 0, 0); + self.fill_boxes3(boxes, color, 0, 0, false); } pub fn fill_boxes2(&mut self, boxes: &[Rect], color: &Color, dx: i32, dy: i32) { + self.fill_boxes3(boxes, color, dx, dy, false); + } + + fn fill_boxes3(&mut self, boxes: &[Rect], color: &Color, dx: i32, dy: i32, scaled: bool) { if boxes.is_empty() || *color == Color::TRANSPARENT { return; } let (dx, dy) = self.scale_point(dx, dy); for bx in boxes { - let bx = self.scale_rect(*bx); + let bx = match scaled { + false => self.scale_rect(*bx), + true => *bx, + }; self.ops.push(GfxApiOpt::FillRect(FillRect { rect: FramebufferRect::new( (bx.x1() + dx) as f32, From 1c984b804db3d735b36953edc667303b6b84bd69 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 22 May 2024 13:08:13 +0200 Subject: [PATCH 3/4] renderer: insert sync point before rendering toplevel highlight --- src/renderer.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer.rs b/src/renderer.rs index 65523672..911a9f39 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -368,6 +368,7 @@ impl Renderer<'_> { return; }; let color = self.state.theme.colors.highlight.get(); + self.base.ops.push(GfxApiOpt::Sync); self.base.fill_scaled_boxes(slice::from_ref(bounds), &color); } From 87a744e1c6f10be9e24049b74c4c8be34528c895 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Wed, 22 May 2024 13:16:54 +0200 Subject: [PATCH 4/4] tree: focus floating toplevel after mapping --- src/state.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/state.rs b/src/state.rs index 8246aeb1..0d817293 100644 --- a/src/state.rs +++ b/src/state.rs @@ -621,7 +621,12 @@ impl State { } Rect::new_sized(x1, y1, width, height).unwrap() }; - FloatNode::new(self, workspace, position, node); + FloatNode::new(self, workspace, position, node.clone()); + if node.node_visible() { + if let Some(seat) = self.seat_queue.last() { + node.node_do_focus(&seat, Direction::Unspecified); + } + } } pub fn show_workspace(&self, seat: &Rc, name: &str) {