git.lucas.co / cce-designer
graphic design tool
git clone https://git.lucas.co/cce-designer.git

commit4a22a8138f7e16b839efe231d119cbc56d1b7d97
parent8cbb4f7f9b
authorLucas Galante <[email protected]>
date2026-06-26 12:35
Enable drag-to-resize on edges for the main window

 src/window.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/src/window.rs b/src/window.rs
index c504a3d..8ecfa39 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -300,6 +300,36 @@ impl PointerHandler for AppState {
                                     let _ = themed_pointer.set_cursor(_conn, CursorIcon::Default);
                                 }
                             }
+                        } else {
+                            let lx = event.position.0 as f32;
+                            let ly = event.position.1 as f32;
+                            let border = 8.0f32;
+                            let mut cursor = CursorIcon::Default;
+                            if ly < border {
+                                if lx < border {
+                                    cursor = CursorIcon::NwResize;
+                                } else if lx > st.width - border {
+                                    cursor = CursorIcon::NeResize;
+                                } else {
+                                    cursor = CursorIcon::NResize;
+                                }
+                            } else if ly > st.height - border {
+                                if lx < border {
+                                    cursor = CursorIcon::SwResize;
+                                } else if lx > st.width - border {
+                                    cursor = CursorIcon::SeResize;
+                                } else {
+                                    cursor = CursorIcon::SResize;
+                                }
+                            } else if lx < border {
+                                cursor = CursorIcon::WResize;
+                            } else if lx > st.width - border {
+                                cursor = CursorIcon::EResize;
+                            }
+
+                            if let Some(ref themed_pointer) = self.pointer {
+                                let _ = themed_pointer.set_cursor(_conn, cursor);
+                            }
                         }
 
                         if let Some(ref pending) = self.pending_resize {
@@ -410,6 +440,44 @@ impl PointerHandler for AppState {
                                         }
                                     }
                                 }
+                            } else if !st.is_detached_network && btn == cce_ui::widget::MouseButton::Left {
+                                let lx = event.position.0 as f32;
+                                let ly = event.position.1 as f32;
+                                let border = 8.0f32;
+                                use smithay_client_toolkit::reexports::protocols::xdg::shell::client::xdg_toplevel::ResizeEdge;
+                                let mut edge = ResizeEdge::None;
+                                if ly < border {
+                                    if lx < border {
+                                        edge = ResizeEdge::TopLeft;
+                                    } else if lx > st.width - border {
+                                        edge = ResizeEdge::TopRight;
+                                    } else {
+                                        edge = ResizeEdge::Top;
+                                    }
+                                } else if ly > st.height - border {
+                                    if lx < border {
+                                        edge = ResizeEdge::BottomLeft;
+                                    } else if lx > st.width - border {
+                                        edge = ResizeEdge::BottomRight;
+                                    } else {
+                                        edge = ResizeEdge::Bottom;
+                                    }
+                                } else if lx < border {
+                                    edge = ResizeEdge::Left;
+                                } else if lx > st.width - border {
+                                    edge = ResizeEdge::Right;
+                                }
+
+                                if edge != ResizeEdge::None {
+                                    self.pending_resize = Some(PendingResize {
+                                        serial: *serial,
+                                        edge,
+                                        start_x: lx,
+                                        start_y: ly,
+                                        is_move: false,
+                                    });
+                                    continue;
+                                }
                             }
                         }