Skip to content

Commit b233116

Browse files
committed
panel: allow accessing alternative clicks via touchscreen long press (#321)
* - Add longtouch support for alternative actions - Split gestures into press and release to correctly allow cancelling * - pay attention trigg * - use gestures * - use correct actions * - split press and release on tray items * - missed one * - or not * - uncrustify
1 parent 5771c4e commit b233116

File tree

6 files changed

+84
-25
lines changed

6 files changed

+84
-25
lines changed

src/panel/widgets/menu.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,25 @@ WfMenuMenuItem::WfMenuMenuItem(WayfireMenu *_menu, Glib::RefPtr<Gio::DesktopAppI
133133
m_extra_actions_button.insert_action_group("app", m_actions);
134134

135135
auto click_gesture = Gtk::GestureClick::create();
136+
auto long_press = Gtk::GestureLongPress::create();
137+
long_press->set_touch_only(true);
138+
long_press->signal_pressed().connect(
139+
[=] (double x, double y)
140+
{
141+
m_extra_actions_button.activate();
142+
long_press->set_state(Gtk::EventSequenceState::CLAIMED);
143+
click_gesture->set_state(Gtk::EventSequenceState::DENIED);
144+
});
136145
click_gesture->set_button(3);
137146
signals.push_back(click_gesture->signal_pressed().connect([=] (int count, double x, double y)
138147
{
139-
m_extra_actions_button.activate();
140148
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
141149
}));
150+
signals.push_back(click_gesture->signal_released().connect([=] (int count, double x, double y)
151+
{
152+
m_extra_actions_button.activate();
153+
}));
154+
m_button.add_controller(long_press);
142155
m_button.add_controller(click_gesture);
143156
}
144157

src/panel/widgets/notifications/notification-center.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,27 @@ void WayfireNotificationCenter::init(Gtk::Box *container)
2929
button->set_tooltip_text("Middle click to toggle DND mode.");
3030

3131
auto click_gesture = Gtk::GestureClick::create();
32+
auto long_press = Gtk::GestureLongPress::create();
33+
long_press->set_touch_only(true);
34+
long_press->signal_pressed().connect(
35+
[=] (double x, double y)
36+
{
37+
dnd_enabled = !dnd_enabled;
38+
updateIcon();
39+
long_press->set_state(Gtk::EventSequenceState::CLAIMED);
40+
click_gesture->set_state(Gtk::EventSequenceState::DENIED);
41+
});
3242
click_gesture->set_button(2);
3343
click_gesture->signal_pressed().connect([=] (int count, double x, double y)
44+
{
45+
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
46+
});
47+
click_gesture->signal_released().connect([=] (int count, double x, double y)
3448
{
3549
dnd_enabled = !dnd_enabled;
3650
updateIcon();
37-
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
3851
});
52+
button->add_controller(long_press);
3953
button->add_controller(click_gesture);
4054

4155
for (const auto & [id, _] : daemon->getNotifications())

src/panel/widgets/notifications/single-notification.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,13 @@ WfSingleNotification::WfSingleNotification(const Notification & notification)
148148
signals.push_back(click_gesture->signal_pressed().connect(
149149
[id = notification.id, action_key, click_gesture] (int count, double x, double y)
150150
{
151-
Daemon::Instance()->invokeAction(id, action_key);
152151
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
153152
}));
153+
signals.push_back(click_gesture->signal_released().connect(
154+
[id = notification.id, action_key, click_gesture] (int count, double x, double y)
155+
{
156+
Daemon::Instance()->invokeAction(id, action_key);
157+
}));
154158
default_action_ev_box.add_controller(click_gesture);
155159
}
156160
}

src/panel/widgets/tray/item.cpp

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,22 @@ void StatusNotifierItem::init_widget()
9898
}, true));
9999

100100
auto click_gesture = Gtk::GestureClick::create();
101+
auto long_press = Gtk::GestureLongPress::create();
102+
long_press->set_touch_only(true);
103+
long_press->signal_pressed().connect(
104+
[=] (double x, double y)
105+
{
106+
popover.popup();
107+
long_press->set_state(Gtk::EventSequenceState::CLAIMED);
108+
click_gesture->set_state(Gtk::EventSequenceState::DENIED);
109+
});
101110
click_gesture->set_button(0);
102111
signals.push_back(click_gesture->signal_pressed().connect([=] (int count, double x, double y)
112+
{
113+
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
114+
return;
115+
}));
116+
signals.push_back(click_gesture->signal_released().connect([=] (int count, double x, double y)
103117
{
104118
int butt = click_gesture->get_current_button();
105119
const auto ev_coords = Glib::Variant<std::tuple<int, int>>::create({0, 0});
@@ -134,17 +148,11 @@ void StatusNotifierItem::init_widget()
134148
} else if (butt == tertiary_click)
135149
{
136150
item_proxy->call("SecondaryActivate", ev_coords);
137-
} else
138-
{
139-
// Don't claim other buttons
140-
click_gesture->set_state(Gtk::EventSequenceState::DENIED);
141-
return;
142151
}
143152

144-
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
145153
return;
146154
}));
147-
155+
add_controller(long_press);
148156
add_controller(scroll_gesture);
149157
add_controller(click_gesture);
150158
}

src/panel/widgets/volume.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,29 @@ void WayfireVolume::init(Gtk::Box *container)
216216

217217
/* Middle click toggle mute */
218218
auto middle_click_gesture = Gtk::GestureClick::create();
219+
auto long_press = Gtk::GestureLongPress::create();
220+
long_press->set_touch_only(true);
221+
long_press->signal_pressed().connect(
222+
[=] (double x, double y)
223+
{
224+
bool muted = !(gvc_stream && gvc_mixer_stream_get_is_muted(gvc_stream));
225+
gvc_mixer_stream_change_is_muted(gvc_stream, muted);
226+
gvc_mixer_stream_push_volume(gvc_stream);
227+
long_press->set_state(Gtk::EventSequenceState::CLAIMED);
228+
middle_click_gesture->set_state(Gtk::EventSequenceState::DENIED);
229+
});
219230
middle_click_gesture->set_button(2);
220231
signals.push_back(middle_click_gesture->signal_pressed().connect([=] (int count, double x, double y)
232+
{
233+
middle_click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
234+
}));
235+
signals.push_back(middle_click_gesture->signal_released().connect([=] (int count, double x, double y)
221236
{
222237
bool muted = !(gvc_stream && gvc_mixer_stream_get_is_muted(gvc_stream));
223238
gvc_mixer_stream_change_is_muted(gvc_stream, muted);
224239
gvc_mixer_stream_push_volume(gvc_stream);
225240
}));
241+
button.add_controller(long_press);
226242
button.add_controller(middle_click_gesture);
227243

228244
/* Setup layout */

src/panel/widgets/window-list/toplevel.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -118,30 +118,27 @@ class WayfireToplevel::impl
118118
button.add_controller(drag_gesture);
119119

120120
auto click_gesture = Gtk::GestureClick::create();
121+
auto long_press = Gtk::GestureLongPress::create();
122+
long_press->set_touch_only(true);
123+
signals.push_back(long_press->signal_pressed().connect(
124+
[=] (double x, double y)
125+
{
126+
popover.popup();
127+
long_press->set_state(Gtk::EventSequenceState::CLAIMED);
128+
click_gesture->set_state(Gtk::EventSequenceState::DENIED);
129+
}));
121130
click_gesture->set_button(0);
122131
signals.push_back(click_gesture->signal_pressed().connect(
123132
[=] (int count, double x, double y)
124133
{
125-
int butt = click_gesture->get_current_button();
126-
if (butt == 3)
127-
{
128-
popover.popup();
129-
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
130-
} else if (butt == 1)
131-
{
132-
// Don't action it now because the press might be a drag!
133-
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
134-
} else if (butt = 2 && middle_click_close)
135-
{
136-
zwlr_foreign_toplevel_handle_v1_close(handle);
137-
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
138-
}
134+
click_gesture->set_state(Gtk::EventSequenceState::CLAIMED);
139135
}));
140136

141137
signals.push_back(click_gesture->signal_released().connect(
142138
[=] (int count, double x, double y)
143139
{
144-
if (click_gesture->get_current_button() == 1)
140+
int butt = click_gesture->get_current_button();
141+
if (butt == 1)
145142
{
146143
// Ah, it was a press after all!
147144
if (!ignore_next_click)
@@ -150,8 +147,15 @@ class WayfireToplevel::impl
150147
}
151148

152149
ignore_next_click = false;
150+
} else if (butt == 2)
151+
{
152+
zwlr_foreign_toplevel_handle_v1_close(handle);
153+
} else if (butt == 3)
154+
{
155+
popover.popup();
153156
}
154157
}));
158+
button.add_controller(long_press);
155159
button.add_controller(click_gesture);
156160

157161
this->window_list = window_list;

0 commit comments

Comments
 (0)