Fixa dött vänsterklick + setting för skroll på ej startad app
All checks were successful
check / check (push) Successful in 1m37s

Vänsterklick nådde ALDRIG fram: GtkButtons interna klickgest claimar
knapp 1 före vår GestureClick, så released-callbacken avfyrades bara
för mitt/höger. Primäraktionen går nu via knappens clicked-signal
(gesten hanterar bara knapp 2/3). Därmed funkar fokus/minimera,
grupplista-vid-klick och start av pinnade appar.

Ny setting behavior.scroll_stopped (none|launch): vad skroll gör på en
app utan fönster — som du bad om, eget beteende för ej startade appar.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-30 00:55:11 +02:00
parent 1c6ed7815b
commit 266e25a9ff
4 changed files with 49 additions and 7 deletions

View File

@@ -17,7 +17,7 @@ use log::{debug, info};
use crate::config::{
Alignment, AutohideMode, ClickAction, Config, GroupPopup, Layer as CfgLayer,
MiddleClick, Position, ScrollAction, SharedConfig,
MiddleClick, Position, ScrollAction, ScrollStopped, SharedConfig,
};
use crate::icons::{self, AppMeta};
use crate::menu;
@@ -679,7 +679,19 @@ fn build_item_widget(ctx: &Rc<Ctx>, connector: &str, item: Rc<Item>) -> gtk::But
});
}
// klick: vänster/mitt/höger
// vänsterklick: via knappens egna clicked-signal — GtkButtons interna
// gest claimar vänsterknappen, så en egen GestureClick för knapp 1
// avfyras aldrig (buggen som gjorde vänsterklick dött)
{
let ctx = ctx.clone();
let item = item.clone();
let conn2 = connector.to_string();
btn.connect_clicked(move |btn| {
let live = live_item(&ctx, &conn2, &item);
primary_action(&ctx, &conn2, &live, btn);
});
}
// mitt- och högerklick via egen gest
let click = gtk::GestureClick::new();
click.set_button(0);
{
@@ -688,10 +700,13 @@ fn build_item_widget(ctx: &Rc<Ctx>, connector: &str, item: Rc<Item>) -> gtk::But
let btn2 = btn.clone();
let conn2 = connector.to_string();
click.connect_released(move |gesture, _, _, _| {
let button = gesture.current_button();
if button != 2 && button != 3 {
return; // vänsterklick sköts av knappen själv
}
gesture.set_state(gtk::EventSequenceState::Claimed);
let live = live_item(&ctx, &conn2, &item);
match gesture.current_button() {
1 => primary_action(&ctx, &conn2, &live, &btn2),
match button {
2 => middle_action(&ctx, &conn2, &live),
3 => menu::popup_item_menu(&ctx, &live, &btn2),
_ => {}
@@ -743,8 +758,17 @@ fn build_item_widget(ctx: &Rc<Ctx>, connector: &str, item: Rc<Item>) -> gtk::But
step(dy);
return glib::Propagation::Stop;
}
if ctx.cfg.borrow().for_output(&conn2).behavior.scroll == ScrollAction::CycleWindows {
let live = live_item(&ctx, &conn2, &item);
let behavior = ctx.cfg.borrow().for_output(&conn2).behavior;
let live = live_item(&ctx, &conn2, &item);
if live.windows.is_empty() {
// egen setting för appar som inte är igång
if behavior.scroll_stopped == ScrollStopped::Launch {
icons::launch(&live.meta);
return glib::Propagation::Stop;
}
return glib::Propagation::Proceed;
}
if behavior.scroll == ScrollAction::CycleWindows {
cycle_windows(&ctx, &live, dy > 0.0);
glib::Propagation::Stop
} else {