core

WMUtils core.
git clone git://git.zepp.club/core.git
Log | Files | Refs | README | LICENSE

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 }