twmp.c - wmutils - X windows manipulation utilities
 (HTM) git clone git://z3bra.org/wmutils
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       twmp.c (1585B)
       ---
            1 /* See LICENSE file for copyright and license details. */
            2 
            3 #include <xcb/xcb.h>
            4 #include <xcb/xcb_aux.h>
            5 #include <stdlib.h>
            6 #include <stdio.h>
            7 #include <err.h>
            8 
            9 #include "arg.h"
           10 #include "util.h"
           11 
           12 enum {
           13         ABSOLUTE = 0,
           14         RELATIVE = 1
           15 };
           16 
           17 static xcb_screen_t *scr;
           18 static xcb_connection_t *conn;
           19 
           20 static void usage(char *);
           21 static void spot_cursor(int, uint32_t);
           22 static void warp_cursor(int, int, int);
           23 
           24 static void
           25 usage(char *name)
           26 {
           27         fprintf(stderr, "usage: %s [-ar <x> <y>] [wid]\n", name);
           28         exit(1);
           29 }
           30 
           31 static void
           32 spot_cursor(int mode, uint32_t win)
           33 {
           34         xcb_query_pointer_reply_t *r;
           35         xcb_query_pointer_cookie_t c;
           36 
           37         c = xcb_query_pointer(conn, win);
           38         r = xcb_query_pointer_reply(conn, c, NULL);
           39 
           40         if (r == NULL)
           41                 errx(1, "cannot retrieve pointer position");
           42 
           43         if (r->child != XCB_NONE) {
           44                 printf("%d %d\n", r->win_x, r->win_y);
           45         } else {
           46                 printf("%d %d\n", r->root_x, r->root_y);
           47         }
           48 }
           49 
           50 static void
           51 warp_cursor(int x, int y, int mode)
           52 {
           53         xcb_warp_pointer(conn, XCB_NONE, mode ? XCB_NONE : scr->root,
           54                         0, 0, 0, 0, x, y);
           55 }
           56 
           57 int
           58 main(int argc, char **argv)
           59 {
           60         char *argv0;
           61         int mode = ABSOLUTE;
           62         uint32_t win;
           63 
           64         ARGBEGIN {
           65                 case 'a': mode = ABSOLUTE;
           66                           break;
           67                 case 'r': mode = RELATIVE;
           68                           break;
           69                 default : usage(argv0);
           70         } ARGEND;
           71 
           72         init_xcb(&conn);
           73         get_screen(conn, &scr);
           74 
           75         switch (argc) {
           76                 case 0:
           77                 case 1:
           78                         win = argc > 0 ? strtoul(*argv, NULL, 16) : scr->root;
           79                         spot_cursor(mode, win);
           80                         break;
           81                 case 2:
           82                         warp_cursor(atoi(argv[0]), atoi(argv[1]), mode);
           83                         break;
           84                 default:
           85                         usage(argv0);
           86         }
           87         
           88         xcb_aux_sync(conn);
           89 
           90         kill_xcb(&conn);
           91         return 0;
           92 }