wmutils

X windows manipulation utilities
git clone git://z3bra.org/wmutils
Log | Files | Refs | LICENSE

commit eef39204878016fdcc0959132e8c3627e45eaf14
parent f78d3e0b7c3151aabb086bf31392604e9ab662a1
Author: z3bra <willy@mailoo.org>
Date:   Fri Jan 23 20:09:33 2015

wmp can now return the pointer position

Diffstat:
 man/wmp.1 | 15 ++++++++++++---
 wmp.c     | 41 +++++++++++++++++++++++++++++++++++------
 2 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/man/wmp.1 b/man/wmp.1 @@ -6,14 +6,17 @@ .Nd warp mouse cursor .Sh SYNOPSIS .Nm wmp -.Fl ar -.Ar <x> <y> +.Fl [ ar +.Ar <x> <y> ] +.Ar [ wid ] .Sh DESCRIPTION .Nm warps cursor to an absolute or relative position, passed by .Ar x and -.Ar y , +.Ar y . +Returns the position relative to the root window, or +.Ar wid . .Sh ENVIRONMENT .Nm acts on the X display specified by the @@ -24,3 +27,9 @@ variable. .Dl $ wmp a $(wattr xy `pfw`) .Pp .Dl $ wmp r -100 0 +.Pp +.Dl $ wmp 0x01600006 +.Dl 311 49 +.Pp +.Dl $ wmp +.Dl 915 548 diff --git a/wmp.c b/wmp.c @@ -13,20 +13,40 @@ enum { RELATIVE = 1 }; -static xcb_connection_t *conn; static xcb_screen_t *scr; +static xcb_connection_t *conn; static void usage(char *); +static void spot_cursor(int, uint32_t); static void warp_cursor(int, int, int); static void usage(char *name) { - fprintf(stderr, "usage: %s -ar <x> <y>\n", name); + fprintf(stderr, "usage: %s [-ar <x> <y>] [wid]\n", name); exit(1); } static void +spot_cursor(int mode, uint32_t win) +{ + xcb_query_pointer_reply_t *r; + xcb_query_pointer_cookie_t c; + + c = xcb_query_pointer(conn, win); + r = xcb_query_pointer_reply(conn, c, NULL); + + if (r == NULL) + errx(1, "cannot retrieve pointer position"); + + if (r->child != XCB_NONE) { + printf("%d %d\n", r->win_x, r->win_y); + } else { + printf("%d %d\n", r->root_x, r->root_y); + } +} + +static void warp_cursor(int x, int y, int mode) { xcb_warp_pointer(conn, XCB_NONE, mode ? XCB_NONE : scr->root, @@ -38,9 +58,7 @@ main(int argc, char **argv) { char *argv0; int mode = ABSOLUTE; - - if (argc != 4) - usage(argv[0]); + uint32_t win; ARGBEGIN { case 'a': mode = ABSOLUTE; @@ -53,7 +71,18 @@ main(int argc, char **argv) init_xcb(&conn); get_screen(conn, &scr); - warp_cursor(atoi(argv[0]), atoi(argv[1]), mode); + switch (argc) { + case 0: + case 1: + win = argc > 0 ? strtoul(*argv, NULL, 16) : scr->root; + spot_cursor(mode, win); + break; + case 2: + warp_cursor(atoi(argv[0]), atoi(argv[1]), mode); + break; + default: + usage(argv0); + } xcb_flush(conn);