Simplify/deduplicate hot corner computation

This commit is contained in:
Ivan Molodetskikh
2025-08-21 09:14:23 +03:00
parent 0a8b4e036d
commit c9e85a0fe2
2 changed files with 16 additions and 27 deletions
+13 -27
View File
@@ -29,7 +29,7 @@ use smithay::input::touch::{
};
use smithay::input::SeatHandler;
use smithay::output::Output;
use smithay::utils::{Logical, Point, Rectangle, Size, Transform, SERIAL_COUNTER};
use smithay::utils::{Logical, Point, Rectangle, Transform, SERIAL_COUNTER};
use smithay::wayland::keyboard_shortcuts_inhibit::KeyboardShortcutsInhibitor;
use smithay::wayland::pointer_constraints::{with_pointer_constraint, PointerConstraint};
use smithay::wayland::selection::data_device::DnDGrab;
@@ -2295,20 +2295,13 @@ impl State {
pointer.frame(self);
// contents_under() will return no surface when the hot corner should trigger.
let hot_corners = self.niri.config.borrow().gestures.hot_corners;
if !hot_corners.off
&& pointer.current_focus().is_none()
&& !self.niri.screenshot_ui.is_open()
{
let hot_corner = Rectangle::from_size(Size::from((1., 1.)));
if let Some((_, pos_within_output)) = self.niri.output_under(pos) {
let inside_hot_corner = hot_corner.contains(pos_within_output);
if inside_hot_corner && !was_inside_hot_corner {
self.niri.layout.toggle_overview();
}
self.niri.pointer_inside_hot_corner = inside_hot_corner;
// contents_under() will return no surface when the hot corner should trigger, so
// pointer.motion() will set the current focus to None.
if under.hot_corner && pointer.current_focus().is_none() {
if !was_inside_hot_corner {
self.niri.layout.toggle_overview();
}
self.niri.pointer_inside_hot_corner = true;
}
// Activate a new confinement if necessary.
@@ -2384,20 +2377,13 @@ impl State {
pointer.frame(self);
// contents_under() will return no surface when the hot corner should trigger.
let hot_corners = self.niri.config.borrow().gestures.hot_corners;
if !hot_corners.off
&& pointer.current_focus().is_none()
&& !self.niri.screenshot_ui.is_open()
{
let hot_corner = Rectangle::from_size(Size::from((1., 1.)));
if let Some((_, pos_within_output)) = self.niri.output_under(pos) {
let inside_hot_corner = hot_corner.contains(pos_within_output);
if inside_hot_corner && !was_inside_hot_corner {
self.niri.layout.toggle_overview();
}
self.niri.pointer_inside_hot_corner = inside_hot_corner;
// contents_under() will return no surface when the hot corner should trigger, so
// pointer.motion() will set the current focus to None.
if under.hot_corner && pointer.current_focus().is_none() {
if !was_inside_hot_corner {
self.niri.layout.toggle_overview();
}
self.niri.pointer_inside_hot_corner = true;
}
self.niri.maybe_activate_pointer_constraint();
+3
View File
@@ -528,6 +528,8 @@ pub struct PointContents {
pub window: Option<(Window, HitType)>,
// If surface belongs to a layer surface, this is that layer surface.
pub layer: Option<LayerSurface>,
// Pointer is over a hot corner.
pub hot_corner: bool,
}
#[derive(Debug, Default)]
@@ -3403,6 +3405,7 @@ impl Niri {
if !hot_corners.off {
let hot_corner = Rectangle::from_size(Size::from((1., 1.)));
if hot_corner.contains(pos_within_output) {
rv.hot_corner = true;
return rv;
}
}