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 }