Disable synthetic drag on drag and drop

Otherwise, conflicting MouseMove events are generated and page regions start to flicker.
This commit is contained in:
Kirill Bulatov 2024-01-10 10:16:09 +02:00
parent 3c2ebc3d88
commit 6809b92e34

View file

@ -338,6 +338,7 @@ struct MacWindowState {
ime_state: ImeState, ime_state: ImeState,
// Retains the last IME Text // Retains the last IME Text
ime_text: Option<String>, ime_text: Option<String>,
external_files_dragged: bool,
} }
impl MacWindowState { impl MacWindowState {
@ -567,6 +568,7 @@ impl MacWindow {
previous_modifiers_changed_event: None, previous_modifiers_changed_event: None,
ime_state: ImeState::None, ime_state: ImeState::None,
ime_text: None, ime_text: None,
external_files_dragged: false,
}))); })));
(*native_window).set_ivar( (*native_window).set_ivar(
@ -1223,15 +1225,20 @@ extern "C" fn handle_view_event(this: &Object, _: Sel, native_event: id) {
.. ..
}, },
) => { ) => {
lock.synthetic_drag_counter += 1; // Synthetic drag is used for selecting long buffer contents while buffer is being scrolled.
let executor = lock.executor.clone(); // External file drag and drop is able to emit its own synthetic mouse events which will conflict
executor // with these ones.
.spawn(synthetic_drag( if !lock.external_files_dragged {
weak_window_state, lock.synthetic_drag_counter += 1;
lock.synthetic_drag_counter, let executor = lock.executor.clone();
event.clone(), executor
)) .spawn(synthetic_drag(
.detach(); weak_window_state,
lock.synthetic_drag_counter,
event.clone(),
))
.detach();
}
} }
InputEvent::MouseMove(_) if !(is_active || lock.kind == WindowKind::PopUp) => return, InputEvent::MouseMove(_) if !(is_active || lock.kind == WindowKind::PopUp) => return,
@ -1675,6 +1682,7 @@ extern "C" fn dragging_entered(this: &Object, _: Sel, dragging_info: id) -> NSDr
let paths = external_paths_from_event(dragging_info); let paths = external_paths_from_event(dragging_info);
InputEvent::FileDrop(FileDropEvent::Entered { position, paths }) InputEvent::FileDrop(FileDropEvent::Entered { position, paths })
}) { }) {
window_state.lock().external_files_dragged = true;
NSDragOperationCopy NSDragOperationCopy
} else { } else {
NSDragOperationNone NSDragOperationNone
@ -1697,6 +1705,7 @@ extern "C" fn dragging_updated(this: &Object, _: Sel, dragging_info: id) -> NSDr
extern "C" fn dragging_exited(this: &Object, _: Sel, _: id) { extern "C" fn dragging_exited(this: &Object, _: Sel, _: id) {
let window_state = unsafe { get_window_state(this) }; let window_state = unsafe { get_window_state(this) };
send_new_event(&window_state, InputEvent::FileDrop(FileDropEvent::Exited)); send_new_event(&window_state, InputEvent::FileDrop(FileDropEvent::Exited));
window_state.lock().external_files_dragged = false;
} }
extern "C" fn perform_drag_operation(this: &Object, _: Sel, dragging_info: id) -> BOOL { extern "C" fn perform_drag_operation(this: &Object, _: Sel, dragging_info: id) -> BOOL {