apply gestures

This commit is contained in:
Wilkenfeld 2024-07-20 01:20:22 +02:00
parent 6d3ae4d787
commit 7b68298e19
No known key found for this signature in database
8 changed files with 581 additions and 0 deletions

68
dwl.c
View file

@ -95,6 +95,7 @@ enum { ClkTagBar, ClkLtSymbol, ClkStatus, ClkTitle, ClkClient, ClkRoot }; /* cli
enum { NetWMWindowTypeDialog, NetWMWindowTypeSplash, NetWMWindowTypeToolbar,
NetWMWindowTypeUtility, NetLast }; /* EWMH atoms */
#endif
enum { SWIPE_LEFT, SWIPE_RIGHT, SWIPE_DOWN, SWIPE_UP };
typedef union {
int i;
@ -111,6 +112,14 @@ typedef struct {
const Arg arg;
} Button;
typedef struct {
unsigned int mod;
unsigned int motion;
unsigned int fingers_count;
void (*func)(const Arg *);
const Arg arg;
} Gesture;
typedef struct Monitor Monitor;
typedef struct {
/* Must keep these three elements in this order */
@ -278,6 +287,7 @@ static void buffer_destroy(struct wlr_buffer *buffer);
static bool buffer_begin_data_ptr_access(struct wlr_buffer *buffer, uint32_t flags, void **data, uint32_t *format, size_t *stride);
static void buffer_end_data_ptr_access(struct wlr_buffer *buffer);
static void buttonpress(struct wl_listener *listener, void *data);
static int ongesture(struct wlr_pointer_swipe_end_event *event);
static void swipe_begin(struct wl_listener *listener, void *data);
static void swipe_update(struct wl_listener *listener, void *data);
static void swipe_end(struct wl_listener *listener, void *data);
@ -453,6 +463,10 @@ static struct wlr_box sgeom;
static struct wl_list mons;
static Monitor *selmon;
static uint32_t swipe_fingers = 0;
static double swipe_dx = 0;
static double swipe_dy = 0;
static char stext[256];
static struct wl_event_source *status_event_source;
@ -481,6 +495,8 @@ static xcb_atom_t netatom[NetLast];
/* attempt to encapsulate suck into one file */
#include "client.h"
static const unsigned int abzsquare = swipe_min_threshold * swipe_min_threshold;
/* function implementations */
void
applybounds(Client *c, struct wlr_box *bbox)
@ -772,6 +788,11 @@ swipe_begin(struct wl_listener *listener, void *data)
{
struct wlr_pointer_swipe_begin_event *event = data;
swipe_fingers = event->fingers;
// Reset swipe distance at the beginning of a swipe
swipe_dx = 0;
swipe_dy = 0;
// Forward swipe begin event to client
wlr_pointer_gestures_v1_send_swipe_begin(
pointer_gestures,
@ -786,6 +807,11 @@ swipe_update(struct wl_listener *listener, void *data)
{
struct wlr_pointer_swipe_update_event *event = data;
swipe_fingers = event->fingers;
// Accumulate swipe distance
swipe_dx += event->dx;
swipe_dy += event->dy;
// Forward swipe update event to client
wlr_pointer_gestures_v1_send_swipe_update(
pointer_gestures,
@ -796,11 +822,53 @@ swipe_update(struct wl_listener *listener, void *data)
);
}
int
ongesture(struct wlr_pointer_swipe_end_event *event)
{
struct wlr_keyboard *keyboard;
uint32_t mods;
const Gesture *g;
unsigned int motion;
unsigned int adx = (int)round(fabs(swipe_dx));
unsigned int ady = (int)round(fabs(swipe_dy));
int handled = 0;
if (event->cancelled) {
return handled;
}
// Require absolute distance movement beyond a small thresh-hold
if (adx * adx + ady * ady < abzsquare) {
return handled;
}
if (adx > ady) {
motion = swipe_dx < 0 ? SWIPE_LEFT : SWIPE_RIGHT;
} else {
motion = swipe_dy < 0 ? SWIPE_UP : SWIPE_DOWN;
}
keyboard = wlr_seat_get_keyboard(seat);
mods = keyboard ? wlr_keyboard_get_modifiers(keyboard) : 0;
for (g = gestures; g < END(gestures); g++) {
if (CLEANMASK(mods) == CLEANMASK(g->mod) &&
swipe_fingers == g->fingers_count &&
motion == g->motion && g->func) {
g->func(&g->arg);
handled = 1;
}
}
return handled;
}
void
swipe_end(struct wl_listener *listener, void *data)
{
struct wlr_pointer_swipe_end_event *event = data;
// TODO: should we stop here if the event has been handled?
ongesture(event);
// Forward swipe end event to client
wlr_pointer_gestures_v1_send_swipe_end(
pointer_gestures,