glazier

the original window manipulator
Log | Files | Refs | Submodules | README | LICENSE

commit 45a966a1559ea5c24b85b9a988e70f9e21eb5ca6
parent 2af6916320279d2f43d45b2d6a2eed5e4a2e3aef
Author: Willy Goiffon <dev@z3bra.org>
Date:   Fri, 18 Oct 2019 23:59:47 +0200

Grab pointer and change cursor on mouse press

Diffstat:
config.def.h | 3+++
config.mk | 2+-
glazier.c | 35+++++++++++++++++++++++++++++++++++
3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/config.def.h b/config.def.h @@ -1,6 +1,9 @@ /* modifier key used for wm actions */ #define MODMASK XCB_MOD_MASK_4 +#define XHAIR_MOVE "hand1" +#define XHAIR_SIZE "tcross" + /* window borders */ int border = 8; int border_color = 0xdeadca7; diff --git a/config.mk b/config.mk @@ -9,4 +9,4 @@ MANDIR = ${PREFIX}/man CPPFLAGS = -I./libwm -DVERSION=\"${VERSION}\" CFLAGS = $(CPPFLAGS) -Wall -Wextra -pedantic -g LDFLAGS = -L./libwm -LDLIBS = -lxcb -lwm +LDLIBS = -lxcb -lxcb-cursor -lwm diff --git a/glazier.c b/glazier.c @@ -1,5 +1,7 @@ #include <stdio.h> +#include <stdlib.h> #include <xcb/xcb.h> +#include <xcb/xcb_cursor.h> #include "wm.h" #include "config.h" @@ -62,12 +64,45 @@ cb_create(xcb_generic_event_t *ev) static int cb_mouse_press(xcb_generic_event_t *ev) { + xcb_cursor_t p; + xcb_cursor_context_t *cx; + xcb_grab_pointer_cookie_t c; + xcb_grab_pointer_reply_t *r; xcb_button_press_event_t *e; e = (xcb_button_press_event_t *)ev; if (verbose) fprintf(stderr, "mouse_press: 0x%08x\n", e->child); + if (xcb_cursor_context_new(conn, scrn, &cx) < 0) { + fprintf(stderr, "cannont instantiate cursor\n"); + exit(1); + } + + switch(e->detail) { + case 1: + p = xcb_cursor_load_cursor(cx, XHAIR_MOVE); + break; + case 3: + p = xcb_cursor_load_cursor(cx, XHAIR_SIZE); + break; + default: + return 1; + } + + /* grab pointer and watch motion events */ + c = xcb_grab_pointer(conn, 0, scrn->root, XCB_EVENT_MASK_BUTTON_MOTION, + XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, + XCB_NONE, p, XCB_CURRENT_TIME); + + r = xcb_grab_pointer_reply(conn, c, NULL); + if (!r || r->status != XCB_GRAB_STATUS_SUCCESS) { + fprintf(stderr, "cannot grab pointer\n"); + return 1; + } + + xcb_flush(conn); + return 0; }