From edf90816b1437d2a6de3f38db7560731cf38a75c Mon Sep 17 00:00:00 2001 From: "Devin J. Pohly" Date: Sat, 11 Apr 2020 21:29:27 -0500 Subject: [PATCH] implement Button: movemouse, resizemouse --- config.h | 5 +++++ dwl.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/config.h b/config.h index 9594864..f0545c1 100644 --- a/config.h +++ b/config.h @@ -12,3 +12,8 @@ static const Key keys[] = { { MODKEY, XKB_KEY_Escape, quit, {0} }, { MODKEY, XKB_KEY_F1, focusnext, {0} }, }; + +static const Button buttons[] = { + { MODKEY, BTN_LEFT, movemouse, {0} }, + { MODKEY, BTN_RIGHT, resizemouse, {0} }, +}; diff --git a/dwl.c b/dwl.c index 6ef5862..b2cfd38 100644 --- a/dwl.c +++ b/dwl.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -111,8 +112,17 @@ typedef struct { const Arg arg; } Key; +typedef struct { + unsigned int mod; + unsigned int button; + void (*func)(struct dwl_server *, const Arg *); + const Arg arg; +} Button; + static void focusnext(struct dwl_server *, const Arg *); +static void movemouse(struct dwl_server *, const Arg *); static void quit(struct dwl_server *, const Arg *); +static void resizemouse(struct dwl_server *, const Arg *); #include "config.h" @@ -513,6 +523,16 @@ static void server_cursor_button(struct wl_listener *listener, void *data) { } else { /* Focus that client if the button was _pressed_ */ focus_view(view, surface); + + struct wlr_keyboard *keyboard = wlr_seat_get_keyboard(seat); + uint32_t mods = wlr_keyboard_get_modifiers(keyboard); + for (int i = 0; i < LENGTH(buttons); i++) { + if (event->button == buttons[i].button && + CLEANMASK(mods) == CLEANMASK(buttons[i].mod) && + buttons[i].func) { + buttons[i].func(server, &buttons[i].arg); + } + } } } @@ -757,6 +777,33 @@ static void begin_interactive(struct dwl_view *view, server->resize_edges = edges; } +static void movemouse(struct dwl_server *server, const Arg *unused) { + double sx, sy; + struct wlr_surface *surface; + struct dwl_view *view = desktop_view_at(server, + server->cursor->x, server->cursor->y, &surface, &sx, &sy); + if (!view) { + return; + } + begin_interactive(view, DWL_CURSOR_MOVE, 0); +} + +static void resizemouse(struct dwl_server *server, const Arg *unused) { + double sx, sy; + struct wlr_surface *surface; + struct dwl_view *view = desktop_view_at(server, + server->cursor->x, server->cursor->y, &surface, &sx, &sy); + if (!view) { + return; + } + struct wlr_box geo_box; + wlr_xdg_surface_get_geometry(view->xdg_surface, &geo_box); + wlr_cursor_warp_closest(server->cursor, NULL, + view->x + geo_box.x + geo_box.width, + view->y + geo_box.y + geo_box.height); + begin_interactive(view, DWL_CURSOR_RESIZE, WLR_EDGE_BOTTOM|WLR_EDGE_RIGHT); +} + static void xdg_toplevel_request_move( struct wl_listener *listener, void *data) { /* This event is raised when a client would like to begin an interactive