tAllow mouse operations using a modifier - glazier - window management experiments
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Submodules
(DIR) README
(DIR) LICENSE
---
(DIR) commit 437de7576114491fcbfe12c16d0c4c53d2e85396
(DIR) parent 0a68322d5c5da090086a868893e8d736d4caa8aa
(HTM) Author: Willy Goiffon <dev@z3bra.org>
Date: Wed, 23 Oct 2019 19:39:28 +0200
Allow mouse operations using a modifier
Diffstat:
M config.def.h | 2 ++
M glazier.c | 50 +++++++++++++++++--------------
2 files changed, 29 insertions(+), 23 deletions(-)
---
(DIR) diff --git a/config.def.h b/config.def.h
t@@ -2,6 +2,8 @@
#define XHAIR_SIZE "tcross"
#define XHAIR_DFLT "left_ptr"
+int modifier = XCB_MOD_MASK_1;
+
/* window borders and titlebar */
int border = 2;
int border_color = 0xdeadca7;
(DIR) diff --git a/glazier.c b/glazier.c
t@@ -114,6 +114,7 @@ cb_mapreq(xcb_generic_event_t *ev)
wm_remap(e->window, MAP);
wm_set_focus(e->window);
wm_set_border(border, border_color, e->window);
+ wm_reg_event(e->window, XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_STRUCTURE_NOTIFY);
return 0;
}
t@@ -136,7 +137,7 @@ cb_mouse_press(xcb_generic_event_t *ev)
return 0;
if (verbose)
- fprintf(stderr, "%s 0x%08x\n", XEV(e), e->event);
+ fprintf(stderr, "%s 0x%08x %d\n", XEV(e), e->event, e->detail);
if (xcb_cursor_context_new(conn, scrn, &cx) < 0) {
fprintf(stderr, "cannot instantiate cursor\n");
t@@ -145,44 +146,43 @@ cb_mouse_press(xcb_generic_event_t *ev)
wm_restack(e->event, XCB_STACK_MODE_ABOVE);
- cursor.x = e->root_x - wm_get_attribute(e->event, ATTR_X);
- cursor.y = e->root_y - wm_get_attribute(e->event, ATTR_Y);
+ cursor.x = e->root_x - wm_get_attribute(e->child, ATTR_X);
+ cursor.y = e->root_y - wm_get_attribute(e->child, ATTR_Y);
cursor.b = e->detail;
lasttime = e->time;
switch(e->detail) {
case 1:
- curwid = e->event;
+ curwid = e->child;
p = xcb_cursor_load_cursor(cx, XHAIR_MOVE);
break;
case 2:
- xcb_kill_client(conn, e->event);
+ xcb_kill_client(conn, e->child);
break;
case 3:
- curwid = e->event;
+ curwid = e->child;
p = xcb_cursor_load_cursor(cx, XHAIR_SIZE);
break;
case 4:
- x = wm_get_attribute(e->event, ATTR_X) - move_step/2;
- y = wm_get_attribute(e->event, ATTR_Y) - move_step/2;
- w = wm_get_attribute(e->event, ATTR_W) + move_step;
- h = wm_get_attribute(e->event, ATTR_H) + move_step;
- wm_teleport(e->event, x, y, w, h);
+ x = wm_get_attribute(e->child, ATTR_X) - move_step/2;
+ y = wm_get_attribute(e->child, ATTR_Y) - move_step/2;
+ w = wm_get_attribute(e->child, ATTR_W) + move_step;
+ h = wm_get_attribute(e->child, ATTR_H) + move_step;
+ wm_teleport(e->child, x, y, w, h);
break;
case 5:
- x = wm_get_attribute(e->event, ATTR_X) + move_step/2;
- y = wm_get_attribute(e->event, ATTR_Y) + move_step/2;
- w = wm_get_attribute(e->event, ATTR_W) - move_step;
- h = wm_get_attribute(e->event, ATTR_H) - move_step;
- wm_teleport(e->event, x, y, w, h);
+ x = wm_get_attribute(e->child, ATTR_X) + move_step/2;
+ y = wm_get_attribute(e->child, ATTR_Y) + move_step/2;
+ w = wm_get_attribute(e->child, ATTR_W) - move_step;
+ h = wm_get_attribute(e->child, ATTR_H) - move_step;
+ wm_teleport(e->child, x, y, w, h);
break;
default:
return 1;
}
/* grab pointer and watch motion events */
- c = xcb_grab_pointer(conn, 0, scrn->root,
- XCB_EVENT_MASK_BUTTON_PRESS |
+ c = xcb_grab_pointer(conn, 1, scrn->root,
XCB_EVENT_MASK_BUTTON_RELEASE |
XCB_EVENT_MASK_BUTTON_MOTION,
XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC,
t@@ -208,7 +208,7 @@ cb_mouse_release(xcb_generic_event_t *ev)
e = (xcb_button_release_event_t *)ev;
if (verbose)
- fprintf(stderr, "%s 0x%08x\n", XEV(e), e->event);
+ fprintf(stderr, "%s 0x%08x %d\n", XEV(e), e->event, e->detail);
if (xcb_cursor_context_new(conn, scrn, &cx) < 0) {
fprintf(stderr, "cannot instantiate cursor\n");
t@@ -239,7 +239,7 @@ cb_motion(xcb_generic_event_t *ev)
e = (xcb_motion_notify_event_t *)ev;
/* ignore some motion events if they happen too often */
- if (e->time - lasttime < 32 || curwid == scrn->root)
+ if (e->time - lasttime < 32)
return 0;
if (verbose)
t@@ -249,13 +249,13 @@ cb_motion(xcb_generic_event_t *ev)
y = e->root_y;
lasttime = e->time;
- switch (cursor.b) {
- case 1:
+ switch (e->state & (XCB_BUTTON_MASK_1|XCB_BUTTON_MASK_3)) {
+ case XCB_BUTTON_MASK_1:
x -= cursor.x;
y -= cursor.y;
wm_move(curwid, ABSOLUTE, x, y);
break;
- case 3:
+ case XCB_BUTTON_MASK_3:
wm_resize(curwid, ABSOLUTE, x, y);
break;
}
t@@ -367,6 +367,10 @@ main (int argc, char *argv[])
return -1;
}
+ xcb_grab_button(conn, 0, scrn->root, XCB_EVENT_MASK_BUTTON_PRESS,
+ XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, scrn->root,
+ XCB_NONE, XCB_BUTTON_INDEX_ANY, modifier);
+
for (;;) {
xcb_flush(conn);
ev = xcb_wait_for_event(conn);