diff --git a/src/panel/widgets/menu.cpp b/src/panel/widgets/menu.cpp index 61cb6ad5..cd86dc5e 100644 --- a/src/panel/widgets/menu.cpp +++ b/src/panel/widgets/menu.cpp @@ -129,12 +129,25 @@ WfMenuMenuItem::WfMenuMenuItem(WayfireMenu *_menu, Glib::RefPtrset_touch_only(true); + long_press->signal_pressed().connect( + [=] (double x, double y) + { + m_extra_actions_button.activate(); + long_press->set_state(Gtk::EventSequenceState::CLAIMED); + click_gesture->set_state(Gtk::EventSequenceState::DENIED); + }); click_gesture->set_button(3); click_gesture->signal_pressed().connect([=] (int count, double x, double y) { - m_extra_actions_button.activate(); click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); }); + click_gesture->signal_released().connect([=] (int count, double x, double y) + { + m_extra_actions_button.activate(); + }); + m_button.add_controller(long_press); m_button.add_controller(click_gesture); } diff --git a/src/panel/widgets/notifications/notification-center.cpp b/src/panel/widgets/notifications/notification-center.cpp index a0a51eed..a930b3db 100644 --- a/src/panel/widgets/notifications/notification-center.cpp +++ b/src/panel/widgets/notifications/notification-center.cpp @@ -29,13 +29,27 @@ void WayfireNotificationCenter::init(Gtk::Box *container) button->set_tooltip_text("Middle click to toggle DND mode."); auto click_gesture = Gtk::GestureClick::create(); + auto long_press = Gtk::GestureLongPress::create(); + long_press->set_touch_only(true); + long_press->signal_pressed().connect( + [=] (double x, double y) + { + dnd_enabled = !dnd_enabled; + updateIcon(); + long_press->set_state(Gtk::EventSequenceState::CLAIMED); + click_gesture->set_state(Gtk::EventSequenceState::DENIED); + }); click_gesture->set_button(2); click_gesture->signal_pressed().connect([=] (int count, double x, double y) + { + click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); + }); + click_gesture->signal_released().connect([=] (int count, double x, double y) { dnd_enabled = !dnd_enabled; updateIcon(); - click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); }); + button->add_controller(long_press); button->add_controller(click_gesture); for (const auto & [id, _] : daemon->getNotifications()) diff --git a/src/panel/widgets/notifications/single-notification.cpp b/src/panel/widgets/notifications/single-notification.cpp index fbb5fb0b..f82b1443 100644 --- a/src/panel/widgets/notifications/single-notification.cpp +++ b/src/panel/widgets/notifications/single-notification.cpp @@ -147,9 +147,13 @@ WfSingleNotification::WfSingleNotification(const Notification & notification) click_gesture->signal_pressed().connect( [id = notification.id, action_key, click_gesture] (int count, double x, double y) { - Daemon::Instance()->invokeAction(id, action_key); click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); }); + click_gesture->signal_released().connect( + [id = notification.id, action_key, click_gesture] (int count, double x, double y) + { + Daemon::Instance()->invokeAction(id, action_key); + }); default_action_ev_box.add_controller(click_gesture); } } diff --git a/src/panel/widgets/tray/item.cpp b/src/panel/widgets/tray/item.cpp index 4255fcb6..5fc2e276 100644 --- a/src/panel/widgets/tray/item.cpp +++ b/src/panel/widgets/tray/item.cpp @@ -95,8 +95,22 @@ void StatusNotifierItem::init_widget() }, true); auto click_gesture = Gtk::GestureClick::create(); + auto long_press = Gtk::GestureLongPress::create(); + long_press->set_touch_only(true); + long_press->signal_pressed().connect( + [=] (double x, double y) + { + popover.popup(); + long_press->set_state(Gtk::EventSequenceState::CLAIMED); + click_gesture->set_state(Gtk::EventSequenceState::DENIED); + }); click_gesture->set_button(0); click_gesture->signal_pressed().connect([=] (int count, double x, double y) + { + click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); + return; + }); + click_gesture->signal_released().connect([=] (int count, double x, double y) { int butt = click_gesture->get_current_button(); const auto ev_coords = Glib::Variant>::create({0, 0}); @@ -131,17 +145,11 @@ void StatusNotifierItem::init_widget() } else if (butt == tertiary_click) { item_proxy->call("SecondaryActivate", ev_coords); - } else - { - // Don't claim other buttons - click_gesture->set_state(Gtk::EventSequenceState::DENIED); - return; } - click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); return; }); - + add_controller(long_press); add_controller(scroll_gesture); add_controller(click_gesture); } diff --git a/src/panel/widgets/volume.cpp b/src/panel/widgets/volume.cpp index d6bd8034..263012dc 100644 --- a/src/panel/widgets/volume.cpp +++ b/src/panel/widgets/volume.cpp @@ -296,13 +296,29 @@ void WayfireVolume::init(Gtk::Box *container) /* Middle click toggle mute */ auto middle_click_gesture = Gtk::GestureClick::create(); + auto long_press = Gtk::GestureLongPress::create(); + long_press->set_touch_only(true); + long_press->signal_pressed().connect( + [=] (double x, double y) + { + bool muted = !(gvc_stream && gvc_mixer_stream_get_is_muted(gvc_stream)); + gvc_mixer_stream_change_is_muted(gvc_stream, muted); + gvc_mixer_stream_push_volume(gvc_stream); + long_press->set_state(Gtk::EventSequenceState::CLAIMED); + middle_click_gesture->set_state(Gtk::EventSequenceState::DENIED); + }); middle_click_gesture->set_button(2); middle_click_gesture->signal_pressed().connect([=] (int count, double x, double y) + { + middle_click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); + }); + middle_click_gesture->signal_released().connect([=] (int count, double x, double y) { bool muted = !(gvc_stream && gvc_mixer_stream_get_is_muted(gvc_stream)); gvc_mixer_stream_change_is_muted(gvc_stream, muted); gvc_mixer_stream_push_volume(gvc_stream); }); + button.add_controller(long_press); button.add_controller(middle_click_gesture); /* Setup layout */ diff --git a/src/panel/widgets/window-list/toplevel.cpp b/src/panel/widgets/window-list/toplevel.cpp index e5d2b0cd..5387b46a 100644 --- a/src/panel/widgets/window-list/toplevel.cpp +++ b/src/panel/widgets/window-list/toplevel.cpp @@ -115,30 +115,27 @@ class WayfireToplevel::impl button.add_controller(drag_gesture); auto click_gesture = Gtk::GestureClick::create(); + auto long_press = Gtk::GestureLongPress::create(); + long_press->set_touch_only(true); + long_press->signal_pressed().connect( + [=] (double x, double y) + { + popover.popup(); + long_press->set_state(Gtk::EventSequenceState::CLAIMED); + click_gesture->set_state(Gtk::EventSequenceState::DENIED); + }); click_gesture->set_button(0); click_gesture->signal_pressed().connect( [=] (int count, double x, double y) { - int butt = click_gesture->get_current_button(); - if (butt == 3) - { - popover.popup(); - click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); - } else if (butt == 1) - { - // Don't action it now because the press might be a drag! - click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); - } else if (butt = 2 && middle_click_close) - { - zwlr_foreign_toplevel_handle_v1_close(handle); - click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); - } + click_gesture->set_state(Gtk::EventSequenceState::CLAIMED); }); click_gesture->signal_released().connect( [=] (int count, double x, double y) { - if (click_gesture->get_current_button() == 1) + int butt = click_gesture->get_current_button(); + if (butt == 1) { // Ah, it was a press after all! if (!ignore_next_click) @@ -147,8 +144,15 @@ class WayfireToplevel::impl } ignore_next_click = false; + } else if (butt == 2) + { + zwlr_foreign_toplevel_handle_v1_close(handle); + } else if (butt == 3) + { + popover.popup(); } }); + button.add_controller(long_press); button.add_controller(click_gesture); this->window_list = window_list;