152 lines
4.9 KiB
Diff
152 lines
4.9 KiB
Diff
|
From 7365261e130016e884371d2e288b83e16a9dcb48 Mon Sep 17 00:00:00 2001
|
||
|
From: chayleaf <chayleaf-git@pavluk.org>
|
||
|
Date: Sat, 24 Aug 2024 13:50:38 +0700
|
||
|
Subject: [PATCH 2/5] consider long press done even before release
|
||
|
|
||
|
---
|
||
|
include/notification.h | 16 ++++++++++------
|
||
|
include/wayland.h | 1 +
|
||
|
notification.c | 22 ++++++++++++++++++++++
|
||
|
wayland.c | 15 ++++++++++++++-
|
||
|
4 files changed, 47 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/include/notification.h b/include/notification.h
|
||
|
index a02d855..b1482ec 100644
|
||
|
--- a/include/notification.h
|
||
|
+++ b/include/notification.h
|
||
|
@@ -19,6 +19,12 @@ struct mako_hotspot {
|
||
|
int32_t width, height;
|
||
|
};
|
||
|
|
||
|
+struct mako_binding_context {
|
||
|
+ struct mako_surface *surface;
|
||
|
+ struct mako_seat *seat;
|
||
|
+ uint32_t serial;
|
||
|
+};
|
||
|
+
|
||
|
struct mako_notification {
|
||
|
struct mako_state *state;
|
||
|
struct mako_surface *surface;
|
||
|
@@ -38,6 +44,8 @@ struct mako_notification {
|
||
|
char *body;
|
||
|
int32_t requested_timeout;
|
||
|
struct wl_list actions; // mako_action::link
|
||
|
+ struct mako_timer *long_press_timer;
|
||
|
+ struct mako_binding_context long_press_ctx;
|
||
|
|
||
|
enum mako_notification_urgency urgency;
|
||
|
char *category;
|
||
|
@@ -70,12 +78,6 @@ struct mako_hidden_format_data {
|
||
|
size_t count;
|
||
|
};
|
||
|
|
||
|
-struct mako_binding_context {
|
||
|
- struct mako_surface *surface;
|
||
|
- struct mako_seat *seat;
|
||
|
- uint32_t serial;
|
||
|
-};
|
||
|
-
|
||
|
typedef char *(*mako_format_func_t)(char variable, bool *markup, void *data);
|
||
|
|
||
|
bool hotspot_at(struct mako_hotspot *hotspot, int32_t x, int32_t y);
|
||
|
@@ -100,6 +102,8 @@ size_t format_notification(struct mako_notification *notif, const char *format,
|
||
|
char *buf);
|
||
|
void notification_handle_button(struct mako_notification *notif, uint32_t button,
|
||
|
enum wl_pointer_button_state state, const struct mako_binding_context *ctx);
|
||
|
+void notification_handle_touch_start(struct mako_notification *notif,
|
||
|
+ const struct mako_binding_context *ctx);
|
||
|
void notification_handle_touch(struct mako_notification *notif,
|
||
|
const struct mako_binding_context *ctx, int32_t duration_ms);
|
||
|
void notification_execute_binding(struct mako_notification *notif,
|
||
|
diff --git a/include/wayland.h b/include/wayland.h
|
||
|
index c8767be..d4d39c4 100644
|
||
|
--- a/include/wayland.h
|
||
|
+++ b/include/wayland.h
|
||
|
@@ -3,6 +3,7 @@
|
||
|
|
||
|
#include <stdbool.h>
|
||
|
#include <wayland-client-protocol.h>
|
||
|
+#include "mako.h"
|
||
|
|
||
|
#define MAX_TOUCHPOINTS 10
|
||
|
|
||
|
diff --git a/notification.c b/notification.c
|
||
|
index 7d3db2f..32e7f7b 100644
|
||
|
--- a/notification.c
|
||
|
+++ b/notification.c
|
||
|
@@ -41,6 +41,8 @@ void reset_notification(struct mako_notification *notif) {
|
||
|
|
||
|
destroy_timer(notif->timer);
|
||
|
notif->timer = NULL;
|
||
|
+ destroy_timer(notif->long_press_timer);
|
||
|
+ notif->long_press_timer = NULL;
|
||
|
|
||
|
free(notif->app_name);
|
||
|
free(notif->app_icon);
|
||
|
@@ -447,6 +449,8 @@ void notification_handle_button(struct mako_notification *notif, uint32_t button
|
||
|
|
||
|
void notification_handle_touch(struct mako_notification *notif,
|
||
|
const struct mako_binding_context *ctx, int32_t duration_ms) {
|
||
|
+ destroy_timer(notif->long_press_timer);
|
||
|
+ notif->long_press_timer = NULL;
|
||
|
if (duration_ms >= notif->style.long_press_duration) {
|
||
|
notification_execute_binding(notif, ¬if->style.long_touch_binding, ctx);
|
||
|
} else {
|
||
|
@@ -454,6 +458,24 @@ void notification_handle_touch(struct mako_notification *notif,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+void handle_notification_touch_timer(void *data) {
|
||
|
+ struct mako_notification *notif = data;
|
||
|
+ notif->long_press_timer = NULL;
|
||
|
+ struct mako_binding_context ctx = notif->long_press_ctx;
|
||
|
+ notification_execute_binding(notif, ¬if->style.long_touch_binding, &ctx);
|
||
|
+ set_dirty(ctx.surface);
|
||
|
+}
|
||
|
+
|
||
|
+void notification_handle_touch_start(struct mako_notification *notif,
|
||
|
+ const struct mako_binding_context *ctx) {
|
||
|
+ if (notif->long_press_timer) {
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ notif->long_press_ctx = *ctx;
|
||
|
+ notif->long_press_timer = add_event_loop_timer(¬if->state->event_loop, 500,
|
||
|
+ handle_notification_touch_timer, notif);
|
||
|
+}
|
||
|
+
|
||
|
/*
|
||
|
* Searches through the notifications list and returns the next position at
|
||
|
* which to insert. If no results for the specified urgency are found,
|
||
|
diff --git a/wayland.c b/wayland.c
|
||
|
index d247779..6d8b6ff 100644
|
||
|
--- a/wayland.c
|
||
|
+++ b/wayland.c
|
||
|
@@ -120,10 +120,23 @@ static void touch_handle_down(void *data, struct wl_touch *wl_touch,
|
||
|
if (id >= MAX_TOUCHPOINTS) {
|
||
|
return;
|
||
|
}
|
||
|
+ struct mako_state *state = seat->state;
|
||
|
seat->touch.pts[id].x = wl_fixed_to_int(surface_x);
|
||
|
seat->touch.pts[id].y = wl_fixed_to_int(surface_y);
|
||
|
seat->touch.pts[id].time = time;
|
||
|
- seat->touch.pts[id].surface = get_surface(seat->state, wl_surface);
|
||
|
+ seat->touch.pts[id].surface = get_surface(state, wl_surface);
|
||
|
+
|
||
|
+ struct mako_notification *notif;
|
||
|
+ const struct mako_binding_context ctx = {
|
||
|
+ .surface = seat->touch.pts[id].surface,
|
||
|
+ .seat = seat,
|
||
|
+ .serial = serial,
|
||
|
+ };
|
||
|
+ wl_list_for_each(notif, &state->notifications, link) {
|
||
|
+ if (hotspot_at(¬if->hotspot, seat->touch.pts[id].x, seat->touch.pts[id].y)) {
|
||
|
+ notification_handle_touch_start(notif, &ctx);
|
||
|
+ }
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
static void touch_handle_up(void *data, struct wl_touch *wl_touch,
|
||
|
--
|
||
|
2.45.2
|
||
|
|