diff --git a/crates/gpui/src/platform/linux/wayland/client.rs b/crates/gpui/src/platform/linux/wayland/client.rs index c2a470a48dfccbd2fd0601d48a841b98cf3c482c..a3a57f0491a195ba95cdb0d6c870148131ce1046 100644 --- a/crates/gpui/src/platform/linux/wayland/client.rs +++ b/crates/gpui/src/platform/linux/wayland/client.rs @@ -313,8 +313,7 @@ impl Client for WaylandClient { } .to_string(); - let mut cursor_state = self.state.cursor_state.borrow_mut(); - cursor_state.cursor_icon_name = cursor_icon_name; + self.state.cursor_state.borrow_mut().cursor_icon_name = cursor_icon_name; } fn get_clipboard(&self) -> Rc> { @@ -819,21 +818,21 @@ fn linux_button_to_gpui(button: u32) -> Option { impl Dispatch for WaylandClientState { fn event( - state: &mut Self, + self_state: &mut Self, wl_pointer: &wl_pointer::WlPointer, event: wl_pointer::Event, data: &(), conn: &Connection, qh: &QueueHandle, ) { - let mut cursor_state = state.cursor_state.borrow_mut(); - let mut state = state.client_state_inner.borrow_mut(); - - if cursor_state.cursor.is_none() { - cursor_state.cursor = Some(Cursor::new(&conn, &state.compositor, &qh, &state.shm, 24)); + let mut state = self_state.client_state_inner.borrow_mut(); + { + let mut cursor_state = self_state.cursor_state.borrow_mut(); + if cursor_state.cursor.is_none() { + cursor_state.cursor = + Some(Cursor::new(&conn, &state.compositor, &qh, &state.shm, 24)); + } } - let cursor_icon_name = cursor_state.cursor_icon_name.clone(); - let mut cursor: &mut Cursor = cursor_state.cursor.as_mut().unwrap(); match event { wl_pointer::Event::Enter { @@ -852,8 +851,12 @@ impl Dispatch for WaylandClientState { } if mouse_focused_window.is_some() { state.mouse_focused_window = mouse_focused_window; - cursor.set_serial_id(serial); - cursor.set_icon(&wl_pointer, cursor_icon_name); + let mut cursor_state = self_state.cursor_state.borrow_mut(); + let cursor_icon_name = cursor_state.cursor_icon_name.clone(); + if let Some(mut cursor) = cursor_state.cursor.as_mut() { + cursor.set_serial_id(serial); + cursor.set_icon(&wl_pointer, cursor_icon_name); + } } state.mouse_location = Some(Point { @@ -881,7 +884,11 @@ impl Dispatch for WaylandClientState { modifiers: state.modifiers, }), ); - cursor.set_icon(&wl_pointer, cursor_icon_name); + let mut cursor_state = self_state.cursor_state.borrow_mut(); + let cursor_icon_name = cursor_state.cursor_icon_name.clone(); + if let Some(mut cursor) = cursor_state.cursor.as_mut() { + cursor.set_icon(&wl_pointer, cursor_icon_name); + } } wl_pointer::Event::Button { button, diff --git a/crates/gpui/src/platform/linux/wayland/window.rs b/crates/gpui/src/platform/linux/wayland/window.rs index f7e3cdbe1ee32bc307f9b353b1ea7191b501d224..b8e11fdd20f452a08786bfe35014baf456c218d6 100644 --- a/crates/gpui/src/platform/linux/wayland/window.rs +++ b/crates/gpui/src/platform/linux/wayland/window.rs @@ -43,7 +43,6 @@ struct WaylandWindowInner { renderer: BladeRenderer, bounds: Bounds, scale: f32, - fullscreen: bool, input_handler: Option, decoration_state: WaylandDecorationState, } @@ -102,7 +101,6 @@ impl WaylandWindowInner { renderer: BladeRenderer::new(gpu, extent), bounds, scale: 1.0, - fullscreen: false, input_handler: None, // On wayland, decorations are by default provided by the client @@ -118,6 +116,7 @@ pub(crate) struct WaylandWindowState { pub(crate) toplevel: Arc, pub(crate) outputs: RefCell>, viewport: Option, + fullscreen: RefCell, } impl WaylandWindowState { @@ -136,6 +135,7 @@ impl WaylandWindowState { outputs: RefCell::new(HashSet::default()), toplevel, viewport, + fullscreen: RefCell::new(false), } } @@ -197,7 +197,6 @@ impl WaylandWindowState { } pub fn resize(&self, width: Option, height: Option) { - let scale = self.inner.borrow_mut().scale; self.set_size_and_scale(width, height, None); } @@ -210,7 +209,7 @@ impl WaylandWindowState { if let Some(ref mut fun) = callbacks.fullscreen { fun(fullscreen) } - self.inner.borrow_mut().fullscreen = fullscreen; + self.fullscreen.replace(fullscreen); } /// Notifies the window of the state of the decorations. @@ -285,7 +284,7 @@ impl PlatformWindow for WaylandWindow { } fn content_size(&self) -> Size { - let inner = self.0.inner.borrow_mut(); + let inner = self.0.inner.borrow(); Size { width: Pixels(inner.bounds.size.width as f32), height: Pixels(inner.bounds.size.height as f32), @@ -293,7 +292,7 @@ impl PlatformWindow for WaylandWindow { } fn scale_factor(&self) -> f32 { - self.0.inner.borrow_mut().scale + self.0.inner.borrow().scale } // todo(linux) @@ -363,7 +362,7 @@ impl PlatformWindow for WaylandWindow { } fn toggle_fullscreen(&self) { - if !self.0.inner.borrow().fullscreen { + if !(*self.0.fullscreen.borrow()) { self.0.toplevel.set_fullscreen(None); } else { self.0.toplevel.unset_fullscreen(); @@ -371,7 +370,7 @@ impl PlatformWindow for WaylandWindow { } fn is_fullscreen(&self) -> bool { - self.0.inner.borrow_mut().fullscreen + *self.0.fullscreen.borrow() } fn on_request_frame(&self, callback: Box) { @@ -416,12 +415,11 @@ impl PlatformWindow for WaylandWindow { } fn draw(&self, scene: &Scene) { - let mut inner = self.0.inner.borrow_mut(); - inner.renderer.draw(scene); + self.0.inner.borrow_mut().renderer.draw(scene); } fn sprite_atlas(&self) -> Arc { - let inner = self.0.inner.borrow_mut(); + let inner = self.0.inner.borrow(); inner.renderer.sprite_atlas().clone() } }