From 6bacea28bca63e85946d9fcdd1ef1404d015d82d Mon Sep 17 00:00:00 2001 From: Finn Evers Date: Tue, 6 May 2025 09:25:01 +0200 Subject: [PATCH] editor: Do not insert scrollbar hitboxes when scrollbars are never to be shown (#29316) This PR fixes an issue where scrollbar hitboxes were still inserted for editors despite scrollbars being programmatically disabled via the `show_scrollbars`field. This is basically the same fix as in #27467. The thought process here is that the motivation for `show_scrollbars` is not to just hide the scrollbars in the editor, but to fully disable scrollbars for the associated editor. However, this is currently not the case, as a functioning hitbox for each scrollbar is stil inserted. For example, the behavior with the old assistant panel can be seen below: https://github.com/user-attachments/assets/18af6338-dd28-4794-a6a6-5b9691b243f2 Whilst the scrollbar is not visible, there is still a scrollbar hitbox inserted which triggers hover events and is fully functioning. This PR fixes this by fully skipping the scrollbar layouting whenever `show_scrollbars` is set to false, preventing the hitboxes from being inserted. https://github.com/user-attachments/assets/b6bb6dc7-902f-4383-bf03-506d0a57ec77 Release Notes: - N/A --- crates/editor/src/element.rs | 61 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 966246f9b8..f7540f3ff9 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -1449,7 +1449,7 @@ impl EditorElement { window: &mut Window, cx: &mut App, ) -> Option { - if !snapshot.mode.is_full() { + if !snapshot.mode.is_full() || !self.editor.read(cx).show_scrollbars { return None; } @@ -1462,36 +1462,35 @@ impl EditorElement { } let scrollbar_settings = EditorSettings::get_global(cx).scrollbar; - let show_scrollbars = self.editor.read(cx).show_scrollbars - && match scrollbar_settings.show { - ShowScrollbar::Auto => { - let editor = self.editor.read(cx); - let is_singleton = editor.is_singleton(cx); - // Git - (is_singleton && scrollbar_settings.git_diff && snapshot.buffer_snapshot.has_diff_hunks()) - || - // Buffer Search Results - (is_singleton && scrollbar_settings.search_results && editor.has_background_highlights::()) - || - // Selected Text Occurrences - (is_singleton && scrollbar_settings.selected_text && editor.has_background_highlights::()) - || - // Selected Symbol Occurrences - (is_singleton && scrollbar_settings.selected_symbol && (editor.has_background_highlights::() || editor.has_background_highlights::())) - || - // Diagnostics - (is_singleton && scrollbar_settings.diagnostics != ScrollbarDiagnostics::None && snapshot.buffer_snapshot.has_diagnostics()) - || - // Cursors out of sight - non_visible_cursors - || - // Scrollmanager - editor.scroll_manager.scrollbars_visible() - } - ShowScrollbar::System => self.editor.read(cx).scroll_manager.scrollbars_visible(), - ShowScrollbar::Always => true, - ShowScrollbar::Never => return None, - }; + let show_scrollbars = match scrollbar_settings.show { + ShowScrollbar::Auto => { + let editor = self.editor.read(cx); + let is_singleton = editor.is_singleton(cx); + // Git + (is_singleton && scrollbar_settings.git_diff && snapshot.buffer_snapshot.has_diff_hunks()) + || + // Buffer Search Results + (is_singleton && scrollbar_settings.search_results && editor.has_background_highlights::()) + || + // Selected Text Occurrences + (is_singleton && scrollbar_settings.selected_text && editor.has_background_highlights::()) + || + // Selected Symbol Occurrences + (is_singleton && scrollbar_settings.selected_symbol && (editor.has_background_highlights::() || editor.has_background_highlights::())) + || + // Diagnostics + (is_singleton && scrollbar_settings.diagnostics != ScrollbarDiagnostics::None && snapshot.buffer_snapshot.has_diagnostics()) + || + // Cursors out of sight + non_visible_cursors + || + // Scrollmanager + editor.scroll_manager.scrollbars_visible() + } + ShowScrollbar::System => self.editor.read(cx).scroll_manager.scrollbars_visible(), + ShowScrollbar::Always => true, + ShowScrollbar::Never => return None, + }; Some(EditorScrollbars::from_scrollbar_axes( scrollbar_settings.axes,