From 705939b3bfce5e00aa341c8c590acb300a0616c6 Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Tue, 3 Sep 2019 16:38:28 +0300 Subject: [PATCH] Only update serial on PtrEvent::Enter/Button when seat is already presented (#8) Fixes primary selection storing, when mouse button was pressed inside surface and then released outside. --- CHANGELOG.md | 2 ++ src/threaded.rs | 24 +++++++++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7365ad..8755ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Fix primary selection storing, when releasing button outside of the surface + ## 0.3.4 -- 2019-08-14 - Add fallback to gtk primary selection, when zwp primary selection is not available diff --git a/src/threaded.rs b/src/threaded.rs index 5dc9641..6bf8662 100644 --- a/src/threaded.rs +++ b/src/threaded.rs @@ -665,6 +665,16 @@ fn implement_seat( // Get serials from recieved events from the seat pointer match evt { PtrEvent::Enter { serial, .. } => { + if let Some(seat) = seat_map + .lock() + .unwrap() + .get_mut(&seat_name.lock().unwrap().clone()) + { + // Update serial if "seat" is already presented + seat.1 = serial; + return; + } + seat_map.lock().unwrap().insert( seat_name.lock().unwrap().clone(), ( @@ -678,6 +688,17 @@ fn implement_seat( ); } PtrEvent::Button { serial, .. } => { + if let Some(seat) = seat_map + .lock() + .unwrap() + .get_mut(&seat_name.lock().unwrap().clone()) + { + // Update serial if seat is already presented + seat.1 = serial; + return; + } + + // This is for consistency with `PtrEvent::Enter` seat_map.lock().unwrap().insert( seat_name.lock().unwrap().clone(), ( @@ -690,9 +711,6 @@ fn implement_seat( ), ); } - PtrEvent::Leave { .. } => { - seat_map.lock().unwrap().remove(&*seat_name.lock().unwrap()); - } _ => {} } },