tslw.c - wmutils - X windows manipulation utilities
(HTM) git clone git://z3bra.org/wmutils
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
tslw.c (1588B)
---
1 /* See LICENSE file for copyright and license details. */
2
3 #include <err.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <xcb/xcb.h>
7 #include <xcb/xcb_aux.h>
8 #include <xcb/xcb_cursor.h>
9
10 #include "util.h"
11
12 /* use "heart" to show us your love! */
13 #define XHAIR "tcross"
14
15 static xcb_connection_t *conn;
16 static xcb_screen_t *scr;
17
18 static xcb_window_t
19 select_window(void)
20 {
21 uint32_t val[] = { XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE };
22 xcb_window_t w = 0;
23 xcb_cursor_t p;
24 xcb_cursor_context_t *ctx;
25 xcb_grab_pointer_cookie_t c;
26 xcb_grab_pointer_reply_t *r;
27 xcb_generic_event_t *e;
28
29 if (xcb_cursor_context_new(conn, scr, &ctx) < 0)
30 errx(1, "cannot instantiate cursor");
31
32 p = xcb_cursor_load_cursor(ctx, XHAIR);
33 xcb_flush(conn);
34
35 c = xcb_grab_pointer(conn, 0, scr->root,
36 XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE,
37 XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_NONE, p,
38 XCB_CURRENT_TIME);
39
40 r = xcb_grab_pointer_reply(conn, c, NULL);
41 if (!r || r->status != XCB_GRAB_STATUS_SUCCESS)
42 errx(1, "couldn't grab pointer");
43
44 xcb_change_window_attributes(conn, scr->root, XCB_CW_EVENT_MASK, val);
45 xcb_flush(conn);
46
47 for (;;) {
48 e = xcb_wait_for_event(conn);
49 switch ((e->response_type & ~0x80)) {
50 case XCB_BUTTON_PRESS:
51 w = ((xcb_button_press_event_t*)e)->child;
52 break;
53 case XCB_BUTTON_RELEASE:
54 xcb_cursor_context_free(ctx);
55 return w;
56 break; /* NOTREACHED */
57 }
58 }
59 }
60
61 int
62 main(int argc, char **argv)
63 {
64 init_xcb(&conn);
65 get_screen(conn, &scr);
66
67 printf("0x%08x\n", select_window());
68
69 kill_xcb(&conn);
70 return 0;
71 }