Skip to content

Commit af37648

Browse files
committed
Handle ungrabbing correctly
1 parent 13d2229 commit af37648

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, SwapWindowGrab, 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},
@@ -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, .. } => {

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)