Skip to content

Commit 81e4b22

Browse files
committed
input: Don't follow focus for resize borders
1 parent 7ccfd73 commit 81e4b22

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

src/input/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,9 @@ impl State {
402402

403403
if old_keyboard_target != new_keyboard_target
404404
&& new_keyboard_target.is_some()
405+
&& new_under
406+
.as_ref()
407+
.is_some_and(|(target, _)| target.should_follow_focus())
405408
{
406409
let create_source = if self.common.pointer_focus_state.is_none() {
407410
true

src/shell/element/stack.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,14 +507,20 @@ impl CosmicStack {
507507
&& point_i32.y - geo.loc.y < geo.size.h + TAB_HEIGHT + RESIZE_BORDER)
508508
{
509509
stack_ui = Some((
510-
PointerFocusTarget::StackUI(self.clone()),
510+
PointerFocusTarget::StackUI {
511+
stack: self.clone(),
512+
is_border: true,
513+
},
511514
Point::from((0., 0.)),
512515
));
513516
}
514517

515518
if point_i32.y - geo.loc.y < TAB_HEIGHT {
516519
stack_ui = Some((
517-
PointerFocusTarget::StackUI(self.clone()),
520+
PointerFocusTarget::StackUI {
521+
stack: self.clone(),
522+
is_border: false,
523+
},
518524
Point::from((0., 0.)),
519525
));
520526
}

src/shell/element/window.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,14 +262,20 @@ impl CosmicWindow {
262262
&& point_i32.y - geo.loc.y < geo.size.h + ssd_height + RESIZE_BORDER)
263263
{
264264
window_ui = Some((
265-
PointerFocusTarget::WindowUI(self.clone()),
265+
PointerFocusTarget::WindowUI {
266+
window: self.clone(),
267+
is_border: true,
268+
},
266269
Point::from((0., 0.)),
267270
));
268271
}
269272

270273
if has_ssd && (point_i32.y - geo.loc.y < SSD_HEIGHT) {
271274
window_ui = Some((
272-
PointerFocusTarget::WindowUI(self.clone()),
275+
PointerFocusTarget::WindowUI {
276+
window: self.clone(),
277+
is_border: false,
278+
},
273279
Point::from((0., 0.)),
274280
));
275281
}

src/shell/focus/target.rs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,14 @@ pub enum PointerFocusTarget {
4242
surface: WlSurface,
4343
toplevel: Option<PointerFocusToplevel>,
4444
},
45-
StackUI(CosmicStack),
46-
WindowUI(CosmicWindow),
45+
StackUI {
46+
stack: CosmicStack,
47+
is_border: bool,
48+
},
49+
WindowUI {
50+
window: CosmicWindow,
51+
is_border: bool,
52+
},
4753
ResizeFork(ResizeForkTarget),
4854
ZoomUI(ZoomFocusTarget),
4955
}
@@ -114,8 +120,8 @@ impl PointerFocusTarget {
114120
fn inner_pointer_target(&self) -> &dyn PointerTarget<State> {
115121
match self {
116122
PointerFocusTarget::WlSurface { surface, .. } => surface,
117-
PointerFocusTarget::StackUI(u) => u,
118-
PointerFocusTarget::WindowUI(u) => u,
123+
PointerFocusTarget::StackUI { stack, .. } => stack,
124+
PointerFocusTarget::WindowUI { window, .. } => window,
119125
PointerFocusTarget::ResizeFork(f) => f,
120126
PointerFocusTarget::ZoomUI(e) => e,
121127
}
@@ -124,8 +130,8 @@ impl PointerFocusTarget {
124130
fn inner_touch_target(&self) -> &dyn TouchTarget<State> {
125131
match self {
126132
PointerFocusTarget::WlSurface { surface, .. } => surface,
127-
PointerFocusTarget::StackUI(u) => u,
128-
PointerFocusTarget::WindowUI(u) => u,
133+
PointerFocusTarget::StackUI { stack, .. } => stack,
134+
PointerFocusTarget::WindowUI { window, .. } => window,
129135
PointerFocusTarget::ResizeFork(f) => f,
130136
PointerFocusTarget::ZoomUI(e) => e,
131137
}
@@ -174,8 +180,8 @@ impl PointerFocusTarget {
174180
.find(|(w, _)| w.wl_surface().map(|s2| s == *s2).unwrap_or(false))
175181
.map(|(s, _)| s)
176182
}),
177-
PointerFocusTarget::StackUI(stack) => Some(stack.active()),
178-
PointerFocusTarget::WindowUI(window) => Some(window.surface()),
183+
PointerFocusTarget::StackUI { stack, .. } => Some(stack.active()),
184+
PointerFocusTarget::WindowUI { window, .. } => Some(window.surface()),
179185
_ => None,
180186
}
181187
}
@@ -188,6 +194,15 @@ impl PointerFocusTarget {
188194
_ => false,
189195
}
190196
}
197+
198+
pub fn should_follow_focus(&self) -> bool {
199+
match self {
200+
PointerFocusTarget::WlSurface { .. } => true,
201+
PointerFocusTarget::StackUI { is_border, .. }
202+
| PointerFocusTarget::WindowUI { is_border, .. } => !*is_border,
203+
PointerFocusTarget::ResizeFork(_) | PointerFocusTarget::ZoomUI(_) => false,
204+
}
205+
}
191206
}
192207

193208
impl KeyboardFocusTarget {
@@ -259,8 +274,8 @@ impl IsAlive for PointerFocusTarget {
259274
match self {
260275
// XXX? does this change anything
261276
PointerFocusTarget::WlSurface { surface, .. } => surface.alive(),
262-
PointerFocusTarget::StackUI(e) => e.alive(),
263-
PointerFocusTarget::WindowUI(e) => e.alive(),
277+
PointerFocusTarget::StackUI { stack, .. } => stack.alive(),
278+
PointerFocusTarget::WindowUI { window, .. } => window.alive(),
264279
PointerFocusTarget::ResizeFork(f) => f.alive(),
265280
PointerFocusTarget::ZoomUI(_) => true,
266281
}
@@ -547,8 +562,8 @@ impl WaylandFocus for PointerFocusTarget {
547562
Some(match self {
548563
PointerFocusTarget::WlSurface { surface, .. } => Cow::Borrowed(surface),
549564
PointerFocusTarget::ResizeFork(_)
550-
| PointerFocusTarget::StackUI(_)
551-
| PointerFocusTarget::WindowUI(_)
565+
| PointerFocusTarget::StackUI { .. }
566+
| PointerFocusTarget::WindowUI { .. }
552567
| PointerFocusTarget::ZoomUI(_) => {
553568
return None;
554569
}
@@ -557,12 +572,12 @@ impl WaylandFocus for PointerFocusTarget {
557572
fn same_client_as(&self, object_id: &ObjectId) -> bool {
558573
match self {
559574
PointerFocusTarget::WlSurface { surface, .. } => surface.id().same_client_as(object_id),
560-
PointerFocusTarget::StackUI(stack) => stack
575+
PointerFocusTarget::StackUI { stack, .. } => stack
561576
.active()
562577
.wl_surface()
563578
.map(|s| s.id().same_client_as(object_id))
564579
.unwrap_or(false),
565-
PointerFocusTarget::WindowUI(window) => window
580+
PointerFocusTarget::WindowUI { window, .. } => window
566581
.wl_surface()
567582
.map(|s| s.id().same_client_as(object_id))
568583
.unwrap_or(false),

0 commit comments

Comments
 (0)