ltk/input/pointer/
release.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2026 Liberux Labs, S. L. <info@liberux.net>

use crate::app::App;
use crate::event_loop::AppData;
use crate::platform::Platform;

use super::super::event::PointerInput;

impl<A: App, P: Platform> AppData<A, P>
{
	pub( super ) fn on_pointer_release( &mut self, input: &PointerInput )
	{
		let focus = input.focus;
		let pos = self.surface( focus ).to_physical( input.position.0, input.position.1 );
		self.pointer_pos = pos;
		self.app.on_pointer_move( pos.x, pos.y );
		self.app.on_pointer_button( pos.x, pos.y, false );
		if self.osk_release( focus, pos ) { return; }
		let global_drag = self.has_active_long_press_drag();
		let swipe       = self.swipe_config( focus );
		let events_out =
		{
			let ss = self.surface_mut( focus );
			ss.needs_redraw = true;
			ss.gesture.on_release( pos, &ss.frame.widget_rects, &swipe, global_drag )
		};
		self.apply_release_events( focus, events_out );
		// Cancel any held-button repeat — the press is
		// over, so the timer no longer has anything to
		// fire against.
		self.stop_button_repeat();
		// Slider drag (if any) just ended — cursor reverts
		// from `Grabbing` to whatever the hovered widget
		// asks for.
		self.dispatch_cursor_shape( focus );
	}
}