Fixa högerklicksmenyn: dedikerade pressed-gester för mitt/höger
All checks were successful
check / check (push) Successful in 1m34s
release / build-release (push) Successful in 2m3s

connect_released på en knapp-0-GestureClick avfyrades aldrig på
GtkButton (varken för knapp 2 eller 3) — därför visades aldrig
app-/gruppmenyn. Nu kör mitt- och högerklick varsin gest med
set_button + connect_pressed, samma mönster som panelmenyns gest som
hela tiden fungerat. Radernas högerklicksgest bytt likadant.
Verifierat live: gest → meny → mapped=true, bekräftat av Björn.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-30 01:29:09 +02:00
parent 2d361306b2
commit cf6029cbbc
2 changed files with 28 additions and 18 deletions

View File

@@ -691,29 +691,38 @@ fn build_item_widget(ctx: &Rc<Ctx>, connector: &str, item: Rc<Item>) -> gtk::But
primary_action(&ctx, &conn2, &live, btn);
});
}
// mitt- och högerklick via egen gest
let click = gtk::GestureClick::new();
click.set_button(0);
// mitt- och högerklick: en gest per knapp med connect_pressed —
// samma mönster som panelmenyns gest (connect_released på en
// knapp-0-gest visade sig aldrig avfyras på GtkButton)
{
let ctx = ctx.clone();
let item = item.clone();
let mid = gtk::GestureClick::new();
mid.set_button(2);
let ctx2 = ctx.clone();
let item2 = item.clone();
let conn2 = connector.to_string();
mid.connect_pressed(move |gesture, _, _, _| {
debug!("mittklick-gest");
gesture.set_state(gtk::EventSequenceState::Claimed);
let live = live_item(&ctx2, &conn2, &item2);
middle_action(&ctx2, &conn2, &live);
});
btn.add_controller(mid);
}
{
let right = gtk::GestureClick::new();
right.set_button(3);
let ctx2 = ctx.clone();
let item2 = item.clone();
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
}
right.connect_pressed(move |gesture, _, _, _| {
debug!("högerklick-gest");
gesture.set_state(gtk::EventSequenceState::Claimed);
let live = live_item(&ctx, &conn2, &item);
match button {
2 => middle_action(&ctx, &conn2, &live),
3 => menu::popup_item_menu(&ctx, &live, &btn2),
_ => {}
}
let live = live_item(&ctx2, &conn2, &item2);
menu::popup_item_menu(&ctx2, &live, &btn2);
});
btn.add_controller(right);
}
btn.add_controller(click);
// hover-popup för grupperade appar (om valt i configen)
if item.windows.len() > 1 && cfg.behavior.group_popup == GroupPopup::Hover {

View File

@@ -289,6 +289,7 @@ fn connector_of(ctx: &Rc<Ctx>, widget: &gtk::Button) -> String {
/// Högerklicksmenyn på en app-ikon.
pub fn popup_item_menu(ctx: &Rc<Ctx>, item: &Rc<Item>, anchor: &gtk::Button) {
log::debug!("högerklicksmeny: {} ({} fönster)", item.meta.display_name, item.windows.len());
let cfg = ctx.cfg.borrow();
let has_windows = !item.windows.is_empty();
let all_min = has_windows && item.windows.iter().all(|w| w.minimized);
@@ -527,7 +528,7 @@ pub fn popup_group_list(ctx: &Rc<Ctx>, item: &Rc<Item>, anchor: &gtk::Button) {
let meta3 = item.meta.clone();
let pinned3 = item.pinned;
let row3 = row.clone();
rc.connect_released(move |gesture, _, _, _| {
rc.connect_pressed(move |gesture, _, _, _| {
gesture.set_state(gtk::EventSequenceState::Claimed);
let single = Rc::new(Item {
meta: meta3.clone(),