Wayland: handle mouse input
This commit is contained in:
parent
ed560eab4e
commit
32119a1df7
@ -9,7 +9,7 @@
|
|||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <X11/Xlib.h>
|
#include <wayland-client.h>
|
||||||
|
|
||||||
#include "dbus.h"
|
#include "dbus.h"
|
||||||
#include "draw.h"
|
#include "draw.h"
|
||||||
@ -86,6 +86,7 @@ static gboolean run(void *data)
|
|||||||
if (active) {
|
if (active) {
|
||||||
gint64 now = time_monotonic_now();
|
gint64 now = time_monotonic_now();
|
||||||
gint64 sleep = queues_get_next_datachange(now);
|
gint64 sleep = queues_get_next_datachange(now);
|
||||||
|
sleep = 100000; // Make sure wayland input is handled in time FIXME
|
||||||
gint64 timeout_at = now + sleep;
|
gint64 timeout_at = now + sleep;
|
||||||
|
|
||||||
LOG_D("Dunst: sleeping for %li ms", sleep/1000);
|
LOG_D("Dunst: sleeping for %li ms", sleep/1000);
|
||||||
|
123
src/wayland/wl.c
123
src/wayland/wl.c
@ -12,6 +12,7 @@
|
|||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <linux/input-event-codes.h>
|
||||||
|
|
||||||
#include "protocols/xdg-output-unstable-v1-client-header.h"
|
#include "protocols/xdg-output-unstable-v1-client-header.h"
|
||||||
#include "protocols/xdg-output-unstable-v1.h"
|
#include "protocols/xdg-output-unstable-v1.h"
|
||||||
@ -23,6 +24,7 @@
|
|||||||
|
|
||||||
#include "../log.h"
|
#include "../log.h"
|
||||||
#include "../settings.h"
|
#include "../settings.h"
|
||||||
|
#include "../queues.h"
|
||||||
|
|
||||||
struct window_wl {
|
struct window_wl {
|
||||||
struct wl_surface *surface;
|
struct wl_surface *surface;
|
||||||
@ -45,6 +47,7 @@ struct wl_ctx {
|
|||||||
struct wl_shm *shm;
|
struct wl_shm *shm;
|
||||||
struct zwlr_layer_shell_v1 *layer_shell;
|
struct zwlr_layer_shell_v1 *layer_shell;
|
||||||
struct zxdg_output_manager_v1 *xdg_output_manager;
|
struct zxdg_output_manager_v1 *xdg_output_manager;
|
||||||
|
struct wl_seat *seat;
|
||||||
|
|
||||||
struct wl_list outputs;
|
struct wl_list outputs;
|
||||||
|
|
||||||
@ -56,6 +59,11 @@ struct wl_ctx {
|
|||||||
bool configured;
|
bool configured;
|
||||||
bool dirty;
|
bool dirty;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
struct wl_pointer *wl_pointer;
|
||||||
|
int32_t x, y;
|
||||||
|
} pointer;
|
||||||
|
|
||||||
struct dimensions cur_dim;
|
struct dimensions cur_dim;
|
||||||
|
|
||||||
int32_t width, height;
|
int32_t width, height;
|
||||||
@ -112,8 +120,9 @@ static void output_handle_geometry(void *data, struct wl_output *wl_output,
|
|||||||
int32_t x, int32_t y, int32_t phy_width, int32_t phy_height,
|
int32_t x, int32_t y, int32_t phy_width, int32_t phy_height,
|
||||||
int32_t subpixel, const char *make, const char *model,
|
int32_t subpixel, const char *make, const char *model,
|
||||||
int32_t transform) {
|
int32_t transform) {
|
||||||
//struct wl_output *output = data;
|
//TODO
|
||||||
//output->subpixel = subpixel;
|
/* struct wl_output *output = data; */
|
||||||
|
/* output->subpixel = subpixel; */
|
||||||
}
|
}
|
||||||
|
|
||||||
static void output_handle_scale(void *data, struct wl_output *wl_output,
|
static void output_handle_scale(void *data, struct wl_output *wl_output,
|
||||||
@ -162,6 +171,102 @@ static void destroy_output(struct wl_output *output) {
|
|||||||
free(output);
|
free(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pointer_handle_motion(void *data, struct wl_pointer *wl_pointer,
|
||||||
|
uint32_t time, wl_fixed_t surface_x, wl_fixed_t surface_y) {
|
||||||
|
LOG_I("Pointer handle motion");
|
||||||
|
ctx.pointer.x = wl_fixed_to_int(surface_x);
|
||||||
|
ctx.pointer.y = wl_fixed_to_int(surface_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pointer_handle_button(void *data, struct wl_pointer *wl_pointer,
|
||||||
|
uint32_t serial, uint32_t time, uint32_t button,
|
||||||
|
uint32_t button_state) {
|
||||||
|
|
||||||
|
if (button_state == 0){
|
||||||
|
// make sure it doesn't react twice
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_I("Pointer handle button %i: %i", button, button_state);
|
||||||
|
enum mouse_action *acts;
|
||||||
|
|
||||||
|
switch (button) {
|
||||||
|
case BTN_LEFT:
|
||||||
|
acts = settings.mouse_left_click;
|
||||||
|
break;
|
||||||
|
case BTN_MIDDLE:
|
||||||
|
acts = settings.mouse_middle_click;
|
||||||
|
break;
|
||||||
|
case BTN_RIGHT:
|
||||||
|
acts = settings.mouse_right_click;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_W("Unsupported mouse button: '%d'", button);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Extract this code into seperate function
|
||||||
|
for (int i = 0; acts[i]; i++) {
|
||||||
|
enum mouse_action act = acts[i];
|
||||||
|
if (act == MOUSE_CLOSE_ALL) {
|
||||||
|
queues_history_push_all();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (act == MOUSE_DO_ACTION || act == MOUSE_CLOSE_CURRENT) {
|
||||||
|
int y = settings.separator_height;
|
||||||
|
struct notification *n = NULL;
|
||||||
|
int first = true;
|
||||||
|
for (const GList *iter = queues_get_displayed(); iter;
|
||||||
|
iter = iter->next) {
|
||||||
|
n = iter->data;
|
||||||
|
if (ctx.pointer.y > y && ctx.pointer.y < y + n->displayed_height)
|
||||||
|
break;
|
||||||
|
|
||||||
|
y += n->displayed_height + settings.separator_height;
|
||||||
|
if (first)
|
||||||
|
y += settings.frame_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n) {
|
||||||
|
if (act == MOUSE_CLOSE_CURRENT)
|
||||||
|
queues_notification_close(n, REASON_USER);
|
||||||
|
else
|
||||||
|
notification_do_action(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_pointer_listener pointer_listener = {
|
||||||
|
.enter = noop,
|
||||||
|
.leave = noop,
|
||||||
|
.motion = pointer_handle_motion,
|
||||||
|
.button = pointer_handle_button,
|
||||||
|
.axis = noop,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void seat_handle_capabilities(void *data, struct wl_seat *wl_seat,
|
||||||
|
uint32_t capabilities) {
|
||||||
|
|
||||||
|
if (ctx.pointer.wl_pointer != NULL) {
|
||||||
|
wl_pointer_release(ctx.pointer.wl_pointer);
|
||||||
|
ctx.pointer.wl_pointer = NULL;
|
||||||
|
}
|
||||||
|
if (capabilities & WL_SEAT_CAPABILITY_POINTER) {
|
||||||
|
ctx.pointer.wl_pointer = wl_seat_get_pointer(wl_seat);
|
||||||
|
wl_pointer_add_listener(ctx.pointer.wl_pointer,
|
||||||
|
&pointer_listener, ctx.seat);
|
||||||
|
LOG_I("Adding pointer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_seat_listener seat_listener = {
|
||||||
|
.capabilities = seat_handle_capabilities,
|
||||||
|
.name = noop,
|
||||||
|
};
|
||||||
|
|
||||||
// FIXME: Snipped touch handling
|
// FIXME: Snipped touch handling
|
||||||
|
|
||||||
static void surface_handle_enter(void *data, struct wl_surface *surface,
|
static void surface_handle_enter(void *data, struct wl_surface *surface,
|
||||||
@ -241,9 +346,8 @@ static void handle_global(void *data, struct wl_registry *registry,
|
|||||||
ctx.layer_shell = wl_registry_bind(registry, name,
|
ctx.layer_shell = wl_registry_bind(registry, name,
|
||||||
&zwlr_layer_shell_v1_interface, 1);
|
&zwlr_layer_shell_v1_interface, 1);
|
||||||
} else if (strcmp(interface, wl_seat_interface.name) == 0) {
|
} else if (strcmp(interface, wl_seat_interface.name) == 0) {
|
||||||
struct wl_seat *seat =
|
ctx.seat = wl_registry_bind(registry, name, &wl_seat_interface, 3);
|
||||||
wl_registry_bind(registry, name, &wl_seat_interface, 3);
|
wl_seat_add_listener(ctx.seat, &seat_listener, ctx.seat);
|
||||||
//create_seat(seat);
|
|
||||||
} else if (strcmp(interface, wl_output_interface.name) == 0) {
|
} else if (strcmp(interface, wl_output_interface.name) == 0) {
|
||||||
struct wl_output *output =
|
struct wl_output *output =
|
||||||
wl_registry_bind(registry, name, &wl_output_interface, 3);
|
wl_registry_bind(registry, name, &wl_output_interface, 3);
|
||||||
@ -331,10 +435,7 @@ void finish_wayland() {
|
|||||||
destroy_output(output);
|
destroy_output(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
//struct mako_seat *seat, *seat_tmp;
|
free(ctx.seat);
|
||||||
//wl_list_for_each_safe(seat, seat_tmp, &ctx.seats, link) {
|
|
||||||
// destroy_seat(seat);
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (ctx.xdg_output_manager != NULL) {
|
if (ctx.xdg_output_manager != NULL) {
|
||||||
zxdg_output_manager_v1_destroy(ctx.xdg_output_manager);
|
zxdg_output_manager_v1_destroy(ctx.xdg_output_manager);
|
||||||
@ -346,8 +447,6 @@ void finish_wayland() {
|
|||||||
wl_display_disconnect(ctx.display);
|
wl_display_disconnect(ctx.display);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: Snip
|
|
||||||
|
|
||||||
static struct wl_output *get_configured_output() {
|
static struct wl_output *get_configured_output() {
|
||||||
struct wl_output *output;
|
struct wl_output *output;
|
||||||
// FIXME
|
// FIXME
|
||||||
@ -552,7 +651,7 @@ void wl_win_show(window win) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void wl_win_hide(window win) {
|
void wl_win_hide(window win) {
|
||||||
LOG_W("Hiding window");
|
LOG_I("Hiding window");
|
||||||
ctx.cur_dim.h = 0;
|
ctx.cur_dim.h = 0;
|
||||||
set_dirty();
|
set_dirty();
|
||||||
wl_display_roundtrip(ctx.display);
|
wl_display_roundtrip(ctx.display);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user