From 55720ff0f8badf50cacad4b5a61381394f1f67eb Mon Sep 17 00:00:00 2001 From: Marshall Bowers Date: Fri, 7 Feb 2025 13:59:25 -0500 Subject: [PATCH] Revert "Implement character index for point (cherry-pick #23989) (#24284)" This reverts commit 8ed71b2dd0f1b595b235f56f0e720bbffc02e20d. --- crates/editor/src/editor.rs | 32 +--- crates/editor/src/element.rs | 171 ++++++++++++------- crates/editor/src/mouse_context_menu.rs | 3 +- crates/gpui/examples/input.rs | 14 -- crates/gpui/src/geometry.rs | 31 ---- crates/gpui/src/input.rs | 19 --- crates/gpui/src/platform.rs | 18 -- crates/gpui/src/platform/mac/window.rs | 53 ++---- crates/terminal_view/src/terminal_element.rs | 9 - 9 files changed, 129 insertions(+), 221 deletions(-) diff --git a/crates/editor/src/editor.rs b/crates/editor/src/editor.rs index 2a6c3937a62308dede1fa47a7dbed7c555407116..f8a2ac7b0b0709cdd6bb98cea19986377279d111 100644 --- a/crates/editor/src/editor.rs +++ b/crates/editor/src/editor.rs @@ -63,10 +63,10 @@ pub use editor_settings::{ CurrentLineHighlight, EditorSettings, ScrollBeyondLastLine, SearchSettings, ShowScrollbar, }; pub use editor_settings_controls::*; +use element::LineWithInvisibles; pub use element::{ CursorLayout, EditorElement, HighlightedRange, HighlightedRangeLine, PointForPosition, }; -use element::{LineWithInvisibles, PositionMap}; use futures::{future, FutureExt}; use fuzzy::StringMatchCandidate; @@ -715,7 +715,6 @@ pub struct Editor { >, >, last_bounds: Option>, - last_position_map: Option>, expect_bounds_change: Option>, tasks: BTreeMap<(BufferId, BufferRow), RunnableTasks>, tasks_update_task: Option>, @@ -1378,7 +1377,6 @@ impl Editor { gutter_hovered: false, pixel_position_of_newest_cursor: None, last_bounds: None, - last_position_map: None, expect_bounds_change: None, gutter_dimensions: GutterDimensions::default(), style: None, @@ -14398,7 +14396,7 @@ impl Editor { .and_then(|item| item.to_any().downcast_ref::()) } - fn character_size(&self, window: &mut Window) -> gpui::Size { + fn character_size(&self, window: &mut Window) -> gpui::Point { let text_layout_details = self.text_layout_details(window); let style = &text_layout_details.editor_style; let font_id = window.text_system().resolve_font(&style.text.font()); @@ -14406,7 +14404,7 @@ impl Editor { let line_height = style.text.line_height_in_pixels(window.rem_size()); let em_width = window.text_system().em_width(font_id, font_size).unwrap(); - gpui::Size::new(em_width, line_height) + gpui::Point::new(em_width, line_height) } } @@ -15914,9 +15912,9 @@ impl EntityInputHandler for Editor { cx: &mut Context, ) -> Option> { let text_layout_details = self.text_layout_details(window); - let gpui::Size { - width: em_width, - height: line_height, + let gpui::Point { + x: em_width, + y: line_height, } = self.character_size(window); let snapshot = self.snapshot(window, cx); @@ -15934,24 +15932,6 @@ impl EntityInputHandler for Editor { size: size(em_width, line_height), }) } - - fn character_index_for_point( - &mut self, - point: gpui::Point, - _window: &mut Window, - _cx: &mut Context, - ) -> Option { - let position_map = self.last_position_map.as_ref()?; - if !position_map.text_hitbox.contains(&point) { - return None; - } - let display_point = position_map.point_for_position(point).previous_valid; - let anchor = position_map - .snapshot - .display_point_to_anchor(display_point, Bias::Left); - let utf16_offset = anchor.to_offset_utf16(&position_map.snapshot.buffer_snapshot); - Some(utf16_offset.0) - } } trait SelectionExt { diff --git a/crates/editor/src/element.rs b/crates/editor/src/element.rs index 171ce9f16ec620cd1d4e1dcd7c8f57337b5d88b7..961fe750ce5586c25f7cbec6dc0138b962fbc171 100644 --- a/crates/editor/src/element.rs +++ b/crates/editor/src/element.rs @@ -503,6 +503,7 @@ impl EditorElement { let position_map = layout.position_map.clone(); window.on_key_event({ let editor = self.editor.clone(); + let text_hitbox = layout.text_hitbox.clone(); move |event: &ModifiersChangedEvent, phase, window, cx| { if phase != DispatchPhase::Bubble { return; @@ -511,7 +512,7 @@ impl EditorElement { if editor.hover_state.focused(window, cx) { return; } - Self::modifiers_changed(editor, event, &position_map, window, cx) + Self::modifiers_changed(editor, event, &position_map, &text_hitbox, window, cx) }) } }); @@ -521,18 +522,19 @@ impl EditorElement { editor: &mut Editor, event: &ModifiersChangedEvent, position_map: &PositionMap, + text_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { editor.update_inline_completion_preview(&event.modifiers, window, cx); let mouse_position = window.mouse_position(); - if !position_map.text_hitbox.is_hovered(window) { + if !text_hitbox.is_hovered(window) { return; } editor.update_hovered_link( - position_map.point_for_position(mouse_position), + position_map.point_for_position(text_hitbox.bounds, mouse_position), &position_map.snapshot, event.modifiers, window, @@ -540,11 +542,14 @@ impl EditorElement { ) } + #[allow(clippy::too_many_arguments)] fn mouse_left_down( editor: &mut Editor, event: &MouseDownEvent, hovered_hunk: Option>, position_map: &PositionMap, + text_hitbox: &Hitbox, + gutter_hitbox: &Hitbox, line_numbers: &HashMap, window: &mut Window, cx: &mut Context, @@ -553,8 +558,6 @@ impl EditorElement { return; } - let text_hitbox = &position_map.text_hitbox; - let gutter_hitbox = &position_map.gutter_hitbox; let mut click_count = event.click_count; let mut modifiers = event.modifiers; @@ -611,7 +614,8 @@ impl EditorElement { } } - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, event.position); let position = point_for_position.previous_valid; if modifiers.shift && modifiers.alt { editor.select( @@ -686,13 +690,15 @@ impl EditorElement { editor: &mut Editor, event: &MouseDownEvent, position_map: &PositionMap, + text_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { - if !position_map.text_hitbox.is_hovered(window) { + if !text_hitbox.is_hovered(window) { return; } - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, event.position); mouse_context_menu::deploy_context_menu( editor, Some(event.position), @@ -707,14 +713,16 @@ impl EditorElement { editor: &mut Editor, event: &MouseDownEvent, position_map: &PositionMap, + text_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { - if !position_map.text_hitbox.is_hovered(window) || window.default_prevented() { + if !text_hitbox.is_hovered(window) || window.default_prevented() { return; } - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, event.position); let position = point_for_position.previous_valid; editor.select( @@ -731,11 +739,15 @@ impl EditorElement { fn mouse_up( editor: &mut Editor, event: &MouseUpEvent, + #[cfg_attr( + not(any(target_os = "linux", target_os = "freebsd")), + allow(unused_variables) + )] position_map: &PositionMap, + text_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { - let text_hitbox = &position_map.text_hitbox; let end_selection = editor.has_pending_selection(); let pending_nonempty_selections = editor.has_pending_nonempty_selection(); @@ -755,7 +767,8 @@ impl EditorElement { #[cfg(any(target_os = "linux", target_os = "freebsd"))] if EditorSettings::get_global(cx).middle_click_paste { if let Some(text) = cx.read_from_primary().and_then(|item| item.text()) { - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, event.position); let position = point_for_position.previous_valid; editor.select( @@ -778,10 +791,10 @@ impl EditorElement { editor: &mut Editor, event: &ClickEvent, position_map: &PositionMap, + text_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { - let text_hitbox = &position_map.text_hitbox; let pending_nonempty_selections = editor.has_pending_nonempty_selection(); let multi_cursor_setting = EditorSettings::get_global(cx).multi_cursor_modifier; @@ -791,7 +804,7 @@ impl EditorElement { }; if !pending_nonempty_selections && multi_cursor_modifier && text_hitbox.is_hovered(window) { - let point = position_map.point_for_position(event.up.position); + let point = position_map.point_for_position(text_hitbox.bounds, event.up.position); editor.handle_click_hovered_link(point, event.modifiers(), window, cx); cx.stop_propagation(); @@ -802,6 +815,7 @@ impl EditorElement { editor: &mut Editor, event: &MouseMoveEvent, position_map: &PositionMap, + text_bounds: Bounds, window: &mut Window, cx: &mut Context, ) { @@ -809,8 +823,7 @@ impl EditorElement { return; } - let text_bounds = position_map.text_hitbox.bounds; - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = position_map.point_for_position(text_bounds, event.position); let mut scroll_delta = gpui::Point::::default(); let vertical_margin = position_map.line_height.min(text_bounds.size.height / 3.0); let top = text_bounds.origin.y + vertical_margin; @@ -857,18 +870,19 @@ impl EditorElement { editor: &mut Editor, event: &MouseMoveEvent, position_map: &PositionMap, + text_hitbox: &Hitbox, + gutter_hitbox: &Hitbox, window: &mut Window, cx: &mut Context, ) { - let text_hitbox = &position_map.text_hitbox; - let gutter_hitbox = &position_map.gutter_hitbox; let modifiers = event.modifiers; let gutter_hovered = gutter_hitbox.is_hovered(window); editor.set_gutter_hovered(gutter_hovered, cx); // Don't trigger hover popover if mouse is hovering over context menu if text_hitbox.is_hovered(window) { - let point_for_position = position_map.point_for_position(event.position); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, event.position); editor.update_hovered_link( point_for_position, @@ -4094,7 +4108,8 @@ impl EditorElement { window: &mut Window, cx: &mut App, ) -> Vec { - let point_for_position = position_map.point_for_position(window.mouse_position()); + let point_for_position = + position_map.point_for_position(text_hitbox.bounds, window.mouse_position()); let mut controls = vec![]; @@ -4231,10 +4246,7 @@ impl EditorElement { let scroll_top = layout.position_map.snapshot.scroll_position().y; let gutter_bg = cx.theme().colors().editor_gutter_background; window.paint_quad(fill(layout.gutter_hitbox.bounds, gutter_bg)); - window.paint_quad(fill( - layout.position_map.text_hitbox.bounds, - self.style.background, - )); + window.paint_quad(fill(layout.text_hitbox.bounds, self.style.background)); if let EditorMode::Full = layout.mode { let mut active_rows = layout.active_rows.iter().peekable(); @@ -4259,8 +4271,8 @@ impl EditorElement { end: layout.gutter_hitbox.right(), }), CurrentLineHighlight::Line => Some(Range { - start: layout.position_map.text_hitbox.bounds.left(), - end: layout.position_map.text_hitbox.bounds.right(), + start: layout.text_hitbox.bounds.left(), + end: layout.text_hitbox.bounds.right(), }), CurrentLineHighlight::All => Some(Range { start: layout.hitbox.left(), @@ -4334,7 +4346,7 @@ impl EditorElement { layout.position_map.snapshot.scroll_position().x * layout.position_map.em_width; for (wrap_position, active) in layout.wrap_guides.iter() { - let x = (layout.position_map.text_hitbox.origin.x + let x = (layout.text_hitbox.origin.x + *wrap_position + layout.position_map.em_width / 2.) - scroll_left; @@ -4346,7 +4358,7 @@ impl EditorElement { || scrollbar_y.as_ref().map_or(false, |sy| sy.visible) }; - if x < layout.position_map.text_hitbox.origin.x + if x < layout.text_hitbox.origin.x || (show_scrollbars && x > self.scrollbar_left(&layout.hitbox.bounds)) { continue; @@ -4359,8 +4371,8 @@ impl EditorElement { }; window.paint_quad(fill( Bounds { - origin: point(x, layout.position_map.text_hitbox.origin.y), - size: size(px(1.), layout.position_map.text_hitbox.size.height), + origin: point(x, layout.text_hitbox.origin.y), + size: size(px(1.), layout.text_hitbox.size.height), }, color, )); @@ -4735,7 +4747,7 @@ impl EditorElement { fn paint_text(&mut self, layout: &mut EditorLayout, window: &mut Window, cx: &mut App) { window.with_content_mask( Some(ContentMask { - bounds: layout.position_map.text_hitbox.bounds, + bounds: layout.text_hitbox.bounds, }), |window| { let cursor_style = if self @@ -4749,7 +4761,7 @@ impl EditorElement { } else { CursorStyle::IBeam }; - window.set_cursor_style(cursor_style, &layout.position_map.text_hitbox); + window.set_cursor_style(cursor_style, &layout.text_hitbox); let invisible_display_ranges = self.paint_highlights(layout, window); self.paint_lines(&invisible_display_ranges, layout, window, cx); @@ -4771,7 +4783,7 @@ impl EditorElement { layout: &mut EditorLayout, window: &mut Window, ) -> SmallVec<[Range; 32]> { - window.paint_layer(layout.position_map.text_hitbox.bounds, |window| { + window.paint_layer(layout.text_hitbox.bounds, |window| { let mut invisible_display_ranges = SmallVec::<[Range; 32]>::new(); let line_end_overshoot = 0.15 * layout.position_map.line_height; for (range, color) in &layout.highlighted_ranges { @@ -4850,7 +4862,7 @@ impl EditorElement { // A softer than perfect black let redaction_color = gpui::rgb(0x0e1111); - window.paint_layer(layout.position_map.text_hitbox.bounds, |window| { + window.paint_layer(layout.text_hitbox.bounds, |window| { for range in layout.redacted_ranges.iter() { self.paint_highlighted_range( range.clone(), @@ -5424,13 +5436,13 @@ impl EditorElement { .collect(), }; - highlighted_range.paint(layout.position_map.text_hitbox.bounds, window); + highlighted_range.paint(layout.text_hitbox.bounds, window); } } fn paint_inline_blame(&mut self, layout: &mut EditorLayout, window: &mut Window, cx: &mut App) { if let Some(mut inline_blame) = layout.inline_blame.take() { - window.paint_layer(layout.position_map.text_hitbox.bounds, |window| { + window.paint_layer(layout.text_hitbox.bounds, |window| { inline_blame.paint(window, cx); }) } @@ -5549,6 +5561,8 @@ impl EditorElement { window.on_mouse_event({ let position_map = layout.position_map.clone(); let editor = self.editor.clone(); + let text_hitbox = layout.text_hitbox.clone(); + let gutter_hitbox = layout.gutter_hitbox.clone(); let multi_buffer_range = layout .display_hunks @@ -5587,16 +5601,32 @@ impl EditorElement { event, multi_buffer_range.clone(), &position_map, + &text_hitbox, + &gutter_hitbox, line_numbers.as_ref(), window, cx, ); }), MouseButton::Right => editor.update(cx, |editor, cx| { - Self::mouse_right_down(editor, event, &position_map, window, cx); + Self::mouse_right_down( + editor, + event, + &position_map, + &text_hitbox, + window, + cx, + ); }), MouseButton::Middle => editor.update(cx, |editor, cx| { - Self::mouse_middle_down(editor, event, &position_map, window, cx); + Self::mouse_middle_down( + editor, + event, + &position_map, + &text_hitbox, + window, + cx, + ); }), _ => {} }; @@ -5607,11 +5637,12 @@ impl EditorElement { window.on_mouse_event({ let editor = self.editor.clone(); let position_map = layout.position_map.clone(); + let text_hitbox = layout.text_hitbox.clone(); move |event: &MouseUpEvent, phase, window, cx| { if phase == DispatchPhase::Bubble { editor.update(cx, |editor, cx| { - Self::mouse_up(editor, event, &position_map, window, cx) + Self::mouse_up(editor, event, &position_map, &text_hitbox, window, cx) }); } } @@ -5620,6 +5651,8 @@ impl EditorElement { window.on_mouse_event({ let editor = self.editor.clone(); let position_map = layout.position_map.clone(); + let text_hitbox = layout.text_hitbox.clone(); + let mut captured_mouse_down = None; move |event: &MouseUpEvent, phase, window, cx| match phase { @@ -5633,7 +5666,7 @@ impl EditorElement { .clone(); let mut pending_mouse_down = pending_mouse_down.borrow_mut(); - if pending_mouse_down.is_some() && position_map.text_hitbox.is_hovered(window) { + if pending_mouse_down.is_some() && text_hitbox.is_hovered(window) { captured_mouse_down = pending_mouse_down.take(); window.refresh(); } @@ -5645,7 +5678,7 @@ impl EditorElement { down: mouse_down, up: event.clone(), }; - Self::click(editor, &event, &position_map, window, cx); + Self::click(editor, &event, &position_map, &text_hitbox, window, cx); } }), } @@ -5654,6 +5687,8 @@ impl EditorElement { window.on_mouse_event({ let position_map = layout.position_map.clone(); let editor = self.editor.clone(); + let text_hitbox = layout.text_hitbox.clone(); + let gutter_hitbox = layout.gutter_hitbox.clone(); move |event: &MouseMoveEvent, phase, window, cx| { if phase == DispatchPhase::Bubble { @@ -5664,10 +5699,25 @@ impl EditorElement { if event.pressed_button == Some(MouseButton::Left) || event.pressed_button == Some(MouseButton::Middle) { - Self::mouse_dragged(editor, event, &position_map, window, cx) + Self::mouse_dragged( + editor, + event, + &position_map, + text_hitbox.bounds, + window, + cx, + ) } - Self::mouse_moved(editor, event, &position_map, window, cx) + Self::mouse_moved( + editor, + event, + &position_map, + &text_hitbox, + &gutter_hitbox, + window, + cx, + ) }); } } @@ -7517,12 +7567,6 @@ impl Element for EditorElement { em_width, em_advance, snapshot, - gutter_hitbox: gutter_hitbox.clone(), - text_hitbox: text_hitbox.clone(), - }); - - self.editor.update(cx, |editor, _| { - editor.last_position_map = Some(position_map.clone()) }); let hunk_controls = self.layout_diff_hunk_controls( @@ -7546,6 +7590,7 @@ impl Element for EditorElement { wrap_guides, indent_guides, hitbox, + text_hitbox, gutter_hitbox, display_hunks, content_origin, @@ -7717,6 +7762,7 @@ impl IntoElement for EditorElement { pub struct EditorLayout { position_map: Rc, hitbox: Hitbox, + text_hitbox: Hitbox, gutter_hitbox: Hitbox, content_origin: gpui::Point, scrollbars_layout: AxisPair>, @@ -7896,17 +7942,15 @@ struct CreaseTrailerLayout { bounds: Bounds, } -pub(crate) struct PositionMap { - pub size: Size, - pub line_height: Pixels, - pub scroll_pixel_position: gpui::Point, - pub scroll_max: gpui::Point, - pub em_width: Pixels, - pub em_advance: Pixels, - pub line_layouts: Vec, - pub snapshot: EditorSnapshot, - pub text_hitbox: Hitbox, - pub gutter_hitbox: Hitbox, +struct PositionMap { + size: Size, + line_height: Pixels, + scroll_pixel_position: gpui::Point, + scroll_max: gpui::Point, + em_width: Pixels, + em_advance: Pixels, + line_layouts: Vec, + snapshot: EditorSnapshot, } #[derive(Debug, Copy, Clone)] @@ -7928,8 +7972,11 @@ impl PointForPosition { } impl PositionMap { - pub(crate) fn point_for_position(&self, position: gpui::Point) -> PointForPosition { - let text_bounds = self.text_hitbox.bounds; + fn point_for_position( + &self, + text_bounds: Bounds, + position: gpui::Point, + ) -> PointForPosition { let scroll_position = self.snapshot.scroll_position(); let position = position - text_bounds.origin; let y = position.y.max(px(0.)).min(self.size.height); diff --git a/crates/editor/src/mouse_context_menu.rs b/crates/editor/src/mouse_context_menu.rs index 64c5d730d273862a2b952c6bb172f9865739679a..b9a9aa623de3c7f431433c29099ab77704cbe61e 100644 --- a/crates/editor/src/mouse_context_menu.rs +++ b/crates/editor/src/mouse_context_menu.rs @@ -229,10 +229,9 @@ pub fn deploy_context_menu( cx, ), None => { - let character_size = editor.character_size(window); let menu_position = MenuPosition::PinnedToEditor { source: source_anchor, - offset: gpui::point(character_size.width, character_size.height), + offset: editor.character_size(window), }; Some(MouseContextMenu::new( menu_position, diff --git a/crates/gpui/examples/input.rs b/crates/gpui/examples/input.rs index a3a9d1f321197281297e0d3d091f6b5798ee9d2c..7d0a72f21a702934ef26a30dfaf9a80d519103f3 100644 --- a/crates/gpui/examples/input.rs +++ b/crates/gpui/examples/input.rs @@ -364,20 +364,6 @@ impl EntityInputHandler for TextInput { ), )) } - - fn character_index_for_point( - &mut self, - point: gpui::Point, - _window: &mut Window, - _cx: &mut Context, - ) -> Option { - let line_point = self.last_bounds?.localize(&point)?; - let last_layout = self.last_layout.as_ref()?; - - assert_eq!(last_layout.text, self.content); - let utf8_index = last_layout.index_for_x(point.x - line_point.x)?; - Some(self.offset_to_utf16(utf8_index)) - } } struct TextElement { diff --git a/crates/gpui/src/geometry.rs b/crates/gpui/src/geometry.rs index d6cd83ae605afa448c153649ed197823ecda5f2a..11b4a58554bafbecb049088d8b43238cbd4f315a 100644 --- a/crates/gpui/src/geometry.rs +++ b/crates/gpui/src/geometry.rs @@ -217,19 +217,6 @@ impl Point { } } -impl Point -where - T: Sub + Debug + Clone + Default, -{ - /// Get the position of this point, relative to the given origin - pub fn relative_to(&self, origin: &Point) -> Point { - point( - self.x.clone() - origin.x.clone(), - self.y.clone() - origin.y.clone(), - ) - } -} - impl Mul for Point where T: Mul + Clone + Default + Debug, @@ -389,13 +376,6 @@ pub struct Size { pub height: T, } -impl Size { - /// Create a new Size, a synonym for [`size`] - pub fn new(width: T, height: T) -> Self { - size(width, height) - } -} - /// Constructs a new `Size` with the provided width and height. /// /// # Arguments @@ -1476,17 +1456,6 @@ where } } -impl Bounds -where - T: Add + PartialOrd + Clone + Default + Debug + Sub, -{ - /// Convert a point to the coordinate space defined by this Bounds - pub fn localize(&self, point: &Point) -> Option> { - self.contains(point) - .then(|| point.relative_to(&self.origin)) - } -} - /// Checks if the bounds represent an empty area. /// /// # Returns diff --git a/crates/gpui/src/input.rs b/crates/gpui/src/input.rs index 4acd7f90c1273a1eb51b1be2ccc672a79e6f7710..41a63bd8a3628311a46a491bbf9107eb42edd09b 100644 --- a/crates/gpui/src/input.rs +++ b/crates/gpui/src/input.rs @@ -62,14 +62,6 @@ pub trait EntityInputHandler: 'static + Sized { window: &mut Window, cx: &mut Context, ) -> Option>; - - /// See [`InputHandler::character_index_for_point`] for details - fn character_index_for_point( - &mut self, - point: crate::Point, - window: &mut Window, - cx: &mut Context, - ) -> Option; } /// The canonical implementation of [`PlatformInputHandler`]. Call [`Window::handle_input`] @@ -166,15 +158,4 @@ impl InputHandler for ElementInputHandler { view.bounds_for_range(range_utf16, self.element_bounds, window, cx) }) } - - fn character_index_for_point( - &mut self, - point: crate::Point, - window: &mut Window, - cx: &mut App, - ) -> Option { - self.view.update(cx, |view, cx| { - view.character_index_for_point(point, window, cx) - }) - } } diff --git a/crates/gpui/src/platform.rs b/crates/gpui/src/platform.rs index e3af6654f17107c265c38437e6d6d706ca2667bb..104ec71b8d4160077043315d3cd0df4e7d45f87b 100644 --- a/crates/gpui/src/platform.rs +++ b/crates/gpui/src/platform.rs @@ -792,14 +792,6 @@ impl PlatformInputHandler { cx, ) } - - #[allow(unused)] - pub fn character_index_for_point(&mut self, point: Point) -> Option { - self.cx - .update(|window, cx| self.handler.character_index_for_point(point, window, cx)) - .ok() - .flatten() - } } /// A struct representing a selection in a text buffer, in UTF16 characters. @@ -890,16 +882,6 @@ pub trait InputHandler: 'static { cx: &mut App, ) -> Option>; - /// Get the character offset for the given point in terms of UTF16 characters - /// - /// Corresponds to [characterIndexForPoint:](https://developer.apple.com/documentation/appkit/nstextinputclient/characterindex(for:)) - fn character_index_for_point( - &mut self, - point: Point, - window: &mut Window, - cx: &mut App, - ) -> Option; - /// Allows a given input context to opt into getting raw key repeats instead of /// sending these to the platform. /// TODO: Ideally we should be able to set ApplePressAndHoldEnabled in NSUserDefaults diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index ba5011ef160af20b97d9c118d662fb80b0449153..9d874b4f9b85e24b0d90f82a45f7adcdacd436f4 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -17,8 +17,8 @@ use cocoa::{ }, base::{id, nil}, foundation::{ - NSArray, NSAutoreleasePool, NSDictionary, NSFastEnumeration, NSInteger, NSNotFound, - NSPoint, NSRect, NSSize, NSString, NSUInteger, + NSArray, NSAutoreleasePool, NSDictionary, NSFastEnumeration, NSInteger, NSPoint, NSRect, + NSSize, NSString, NSUInteger, }, }; use core_graphics::display::{CGDirectDisplayID, CGPoint, CGRect}; @@ -227,11 +227,6 @@ unsafe fn build_classes() { accepts_first_mouse as extern "C" fn(&Object, Sel, id) -> BOOL, ); - decl.add_method( - sel!(characterIndexForPoint:), - character_index_for_point as extern "C" fn(&Object, Sel, NSPoint) -> u64, - ); - decl.register() }; } @@ -1692,7 +1687,17 @@ extern "C" fn first_rect_for_character_range( range: NSRange, _: id, ) -> NSRect { - let frame = get_frame(this); + let frame: NSRect = unsafe { + let state = get_window_state(this); + let lock = state.lock(); + let mut frame = NSWindow::frame(lock.native_window); + let content_layout_rect: CGRect = msg_send![lock.native_window, contentLayoutRect]; + let style_mask: NSWindowStyleMask = msg_send![lock.native_window, styleMask]; + if !style_mask.contains(NSWindowStyleMask::NSFullSizeContentViewWindowMask) { + frame.origin.y -= frame.size.height - content_layout_rect.size.height; + } + frame + }; with_input_handler(this, |input_handler| { input_handler.bounds_for_range(range.to_range()?) }) @@ -1713,20 +1718,6 @@ extern "C" fn first_rect_for_character_range( ) } -fn get_frame(this: &Object) -> NSRect { - unsafe { - let state = get_window_state(this); - let lock = state.lock(); - let mut frame = NSWindow::frame(lock.native_window); - let content_layout_rect: CGRect = msg_send![lock.native_window, contentLayoutRect]; - let style_mask: NSWindowStyleMask = msg_send![lock.native_window, styleMask]; - if !style_mask.contains(NSWindowStyleMask::NSFullSizeContentViewWindowMask) { - frame.origin.y -= frame.size.height - content_layout_rect.size.height; - } - frame - } -} - extern "C" fn insert_text(this: &Object, _: Sel, text: id, replacement_range: NSRange) { unsafe { let is_attributed_string: BOOL = @@ -1840,24 +1831,6 @@ extern "C" fn accepts_first_mouse(this: &Object, _: Sel, _: id) -> BOOL { YES } -extern "C" fn character_index_for_point(this: &Object, _: Sel, position: NSPoint) -> u64 { - let position = screen_point_to_gpui_point(this, position); - with_input_handler(this, |input_handler| { - input_handler.character_index_for_point(position) - }) - .flatten() - .map(|index| index as u64) - .unwrap_or(NSNotFound as u64) -} - -fn screen_point_to_gpui_point(this: &Object, position: NSPoint) -> Point { - let frame = get_frame(this); - let window_x = position.x - frame.origin.x; - let window_y = frame.size.height - (position.y - frame.origin.y); - let position = point(px(window_x as f32), px(window_y as f32)); - position -} - extern "C" fn dragging_entered(this: &Object, _: Sel, dragging_info: id) -> NSDragOperation { let window_state = unsafe { get_window_state(this) }; let position = drag_event_position(&window_state, dragging_info); diff --git a/crates/terminal_view/src/terminal_element.rs b/crates/terminal_view/src/terminal_element.rs index eb3a1489e3f3e6e8a0bfa7cd12b7124f9a876014..a8574fbc006a7996e8092d49bd4bd5a907609328 100644 --- a/crates/terminal_view/src/terminal_element.rs +++ b/crates/terminal_view/src/terminal_element.rs @@ -1073,15 +1073,6 @@ impl InputHandler for TerminalInputHandler { fn apple_press_and_hold_enabled(&mut self) -> bool { false } - - fn character_index_for_point( - &mut self, - _point: Point, - _window: &mut Window, - _cx: &mut App, - ) -> Option { - None - } } pub fn is_blank(cell: &IndexedCell) -> bool {