@@ -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 , SwapWindowGrab , 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 } ,
@@ -773,7 +773,13 @@ impl State {
773773 & state. common . xdg_activation_state ,
774774 false ,
775775 ) ;
776+
776777 drop ( shell) ;
778+
779+ seat_clone
780+ . user_data ( )
781+ . get_or_insert ( UngrabOnPointerUp :: new)
782+ . set ( true ) ;
777783 dispatch_grab (
778784 res, seat_clone, serial, state,
779785 ) ;
@@ -856,6 +862,13 @@ impl State {
856862 false ,
857863 ) ;
858864 drop ( shell) ;
865+
866+ seat_clone
867+ . user_data ( )
868+ . get_or_insert (
869+ UngrabOnPointerUp :: new,
870+ )
871+ . set ( true ) ;
859872 dispatch_grab (
860873 res, seat_clone, serial, state,
861874 ) ;
@@ -896,6 +909,13 @@ impl State {
896909 } ,
897910 ) ;
898911 ptr. frame ( self ) ;
912+ } else if event. state ( ) == ButtonState :: Released {
913+ if let Some ( ungrab) = seat. user_data ( ) . get :: < UngrabOnPointerUp > ( ) {
914+ if ungrab. get ( ) {
915+ ungrab. set ( false ) ;
916+ ptr. unset_grab ( self , serial, event. time_msec ( ) )
917+ }
918+ }
899919 }
900920 }
901921 InputEvent :: PointerAxis { event, .. } => {
0 commit comments