wmp.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 }