Skip to content

Commit 05880c6

Browse files
committed
Handle ungrabbing correctly
1 parent 5906717 commit 05880c6

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

src/input/mod.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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};
7575
use 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, .. } => {

src/shell/grabs/mod.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::cell::Cell;
2+
13
use cosmic_settings_config::shortcuts;
24
use smithay::{
35
input::{
@@ -67,6 +69,22 @@ pub enum ReleaseMode {
6769
NoMouseButtons,
6870
}
6971

72+
#[derive(Debug, Clone, PartialEq, Eq)]
73+
pub struct UngrabOnPointerUp(Cell<bool>);
74+
impl UngrabOnPointerUp {
75+
pub fn new() -> Self {
76+
Self(Cell::new(false))
77+
}
78+
79+
pub fn get(&self) -> bool {
80+
self.0.get()
81+
}
82+
83+
pub fn set(&self, ungrab: bool) {
84+
self.0.set(ungrab);
85+
}
86+
}
87+
7088
mod menu;
7189
pub use self::menu::*;
7290
mod moving;

0 commit comments

Comments
 (0)