Add mouse window controls and finer display scaling (#63)

Add configurable mouse and wheel bindings, window move and resize, tab drops, cross-output dragging, and device settings. Adjust display scaling in 0.05 increments.

Preserve opposite-edge positioning during scrolling resizes and show rows for edge drops into tabbed columns.
This commit is contained in:
Samuel Onoja authored and GitHub committed 2026-10-25 14:14:35 +01:00
1 parent ab11269246
commit ad00e55fe4
35 files changed
+3454 -512

No files matched your search

+12 -2
View File
@@ -11,6 +11,8 @@ mod hit_testing;
mod layout;
mod navigation;
mod outputs;
#[cfg(test)]
mod pointer_tests;
mod reconciliation;
pub(crate) mod tab_indicator;
mod tabs;
@@ -488,6 +490,9 @@ pub struct Ferese {
pub(crate) tab_indicator_settings: crate::config::TabIndicatorSettings,
pub(crate) tab_bars: HashMap<WorkspaceId, Vec<ferese_layout::TabBar>>,
pub(crate) consumed_pointer_buttons: HashSet<u32>,
pub(crate) pointer_scroll: crate::input::ScrollBindings,
pub(crate) pointer_operation: Option<crate::input::WindowInteraction>,
pub(crate) window_grab_focus_pending: bool,
pub(crate) pending_layer_focus: Option<(WlSurface, Instant)>,
pub(crate) consumed_touch_slots: HashSet<smithay::backend::input::TouchSlot>,
pub(crate) focus_history: ferese_core::FocusHistory,
@@ -812,6 +817,9 @@ impl Ferese {
tab_indicator_settings: config.tab_indicator,
tab_bars: HashMap::new(),
consumed_pointer_buttons: HashSet::new(),
pointer_scroll: Default::default(),
pointer_operation: None,
window_grab_focus_pending: false,
pending_layer_focus: None,
consumed_touch_slots: HashSet::new(),
focus_history: Default::default(),
@@ -1022,7 +1030,9 @@ impl Ferese {
self.advance_animations(Instant::now());
}
let touchpad_changed = self.input_settings.touchpad != config.input_settings.touchpad;
let pointer_settings_changed = self.input_settings.touchpad
!= config.input_settings.touchpad
|| self.input_settings.mouse != config.input_settings.mouse;
let outputs_changed = self.output_profiles != config.output_profiles;
if let Some(workspaces) = workspaces {
self.workspaces = workspaces;
@@ -1089,7 +1099,7 @@ impl Ferese {
crate::daemon::Runner::refresh(&runner, self);
}
if touchpad_changed {
if pointer_settings_changed {
crate::backends::direct::reload_input_devices(self);
}