From 61557c8240ab243979ec1cc6ad1667ac85be8628 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sat, 4 Apr 2020 11:45:24 +0200 Subject: [PATCH] BListView: do not spawn a thread on every mouse click. That's a bad idea. The drag and drop tracking could get confused enough to crash app_server (possibly because of calling InitiateDrag multiple times?) Fixes #14983. --- headers/os/interface/ListView.h | 3 --- src/kits/interface/ListView.cpp | 46 ++++++++++++++------------------- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/headers/os/interface/ListView.h b/headers/os/interface/ListView.h index f705765e70..f5308827e9 100644 --- a/headers/os/interface/ListView.h +++ b/headers/os/interface/ListView.h @@ -189,9 +189,6 @@ private: bool _ReplaceItem(int32 index, BListItem* item); void _RescanSelection(int32 from, int32 to); - void _DoneTracking(BPoint where); - void _Track(BPoint where, uint32); - private: BList fList; list_view_type fListType; diff --git a/src/kits/interface/ListView.cpp b/src/kits/interface/ListView.cpp index b842aec51a..fce55539b9 100644 --- a/src/kits/interface/ListView.cpp +++ b/src/kits/interface/ListView.cpp @@ -588,8 +588,7 @@ BListView::MouseDown(BPoint where) fTrack->was_selected = index >= 0 ? ItemAt(index)->IsSelected() : false; fTrack->try_drag = true; - MouseDownThread::TrackMouse(this, - &BListView::_DoneTracking, &BListView::_Track); + SetMouseEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); } if (index >= 0) { @@ -636,6 +635,14 @@ void BListView::MouseUp(BPoint where) { BView::MouseUp(where); + + uint32* buttons = 0; + GetMouse(&where, buttons); + + if (buttons == 0) { + fTrack->try_drag = false; + fTrack->is_dragging = false; + } } @@ -643,6 +650,17 @@ void BListView::MouseMoved(BPoint where, uint32 code, const BMessage* dragMessage) { BView::MouseMoved(where, code, dragMessage); + + if (fTrack->item_index >= 0 && fTrack->try_drag) { + // initiate a drag if the mouse was moved far enough + BPoint offset = where - fTrack->drag_start; + float dragDistance = sqrtf(offset.x * offset.x + offset.y * offset.y); + if (dragDistance >= 5.0f) { + fTrack->try_drag = false; + fTrack->is_dragging = InitiateDrag(fTrack->drag_start, + fTrack->item_index, fTrack->was_selected); + } + } } @@ -1966,27 +1984,3 @@ BListView::_RecalcItemTops(int32 start, int32 end) top += ceilf(item->Height()); } } - - -void -BListView::_DoneTracking(BPoint where) -{ - fTrack->try_drag = false; - fTrack->is_dragging = false; -} - - -void -BListView::_Track(BPoint where, uint32) -{ - if (fTrack->item_index >= 0 && fTrack->try_drag) { - // initiate a drag if the mouse was moved far enough - BPoint offset = where - fTrack->drag_start; - float dragDistance = sqrtf(offset.x * offset.x + offset.y * offset.y); - if (dragDistance >= 5.0f) { - fTrack->try_drag = false; - fTrack->is_dragging = InitiateDrag(fTrack->drag_start, - fTrack->item_index, fTrack->was_selected); - } - } -}