@@ -16,7 +16,7 @@ use crate::{
1616 target:: { KeyboardFocusTarget , PointerFocusTarget } ,
1717 Stage ,
1818 } ,
19- grabs:: { ReleaseMode , ResizeEdge } ,
19+ grabs:: { ReleaseMode , ResizeEdge , UngrabOnPointerUp } ,
2020 layout:: {
2121 floating:: ResizeGrabMarker ,
2222 tiling:: { NodeDesc , TilingLayout } ,
@@ -75,7 +75,7 @@ use xkbcommon::xkb::{Keycode, Keysym};
7575use std:: {
7676 any:: Any ,
7777 borrow:: Cow ,
78- cell:: RefCell ,
78+ cell:: { Cell , RefCell } ,
7979 collections:: HashSet ,
8080 ops:: ControlFlow ,
8181 time:: { Duration , Instant } ,
@@ -757,7 +757,13 @@ impl State {
757757 & state. common . xdg_activation_state ,
758758 false ,
759759 ) ;
760+
760761 drop ( shell) ;
762+
763+ seat_clone
764+ . user_data ( )
765+ . get_or_insert ( UngrabOnPointerUp :: new)
766+ . set ( true ) ;
761767 dispatch_grab (
762768 res, seat_clone, serial, state,
763769 ) ;
@@ -835,6 +841,13 @@ impl State {
835841 false ,
836842 ) ;
837843 drop ( shell) ;
844+
845+ seat_clone
846+ . user_data ( )
847+ . get_or_insert (
848+ UngrabOnPointerUp :: new,
849+ )
850+ . set ( true ) ;
838851 dispatch_grab (
839852 res, seat_clone, serial, state,
840853 ) ;
@@ -875,6 +888,13 @@ impl State {
875888 } ,
876889 ) ;
877890 ptr. frame ( self ) ;
891+ } else if event. state ( ) == ButtonState :: Released {
892+ if let Some ( ungrab) = seat. user_data ( ) . get :: < UngrabOnPointerUp > ( ) {
893+ if ungrab. get ( ) {
894+ ungrab. set ( false ) ;
895+ ptr. unset_grab ( self , serial, event. time_msec ( ) )
896+ }
897+ }
878898 }
879899 }
880900 InputEvent :: PointerAxis { event, .. } => {
0 commit comments