rndm_luser /warp.c

Required by ".xinitrc".
/* Compile: gcc -Wall -O2 -lX11 warp.c -o warp */
#include 
#include 
#include 

#include 
#include 

static void
usage (const char *p)
{
    fprintf (stderr, "Usage: %s <...>\n", p);
    fprintf (stderr, "\t%s\t\t: warp to upper left corner of focused window\n", p);
    fprintf (stderr, "\t%s \t: warp to window of xid\n", p);
    fprintf (stderr, "\t%s  \t: warp to coordinates\n", p);
}

int
main (int argc, char **argv)
{
    Display      *display;
    Window        window        , root;
    char         *display_name;
    int           revert_to;
    int           x, y;
    unsigned int  width, height, border_width, depth;

    if (argc > 1) {
        if ((strncmp (argv[1], "-h", 2) == 0)
                || (strncmp (argv[1], "--help", 6) == 0)) {
            usage (argv[0]);
            exit (EXIT_SUCCESS);
        }
    }

    if ((display_name = getenv ("DISPLAY"))) {
        if ((display = XOpenDisplay (display_name))) {
            switch (argc) {
                case 3:		/* args read as x,y coordinates */
                    if ((sscanf (argv[1], "%d", &x) != 1)
                            || (sscanf (argv[2], "%d", &y) != 1)) {
                        fprintf (stderr, "%s: invalid coordinates\n", argv[0]);
                        usage (argv[0]);
                        exit (EXIT_FAILURE);
                    }
                    break;

                case 2:		/* arg read as hexadecimal XID */
                    if ((sscanf (argv[1], "0x%lx", (unsigned long *) &window)) != 1) {
                        fprintf (stderr, "%s: invalid XID\n", argv[0]);
                        usage (argv[0]);
                        exit (EXIT_FAILURE);
                    }
                    XGetGeometry (display, window, &root, &x, &y, &width,
                            &height, &border_width, &depth);
                    break;

                case 1:		/* Warp to upper-left corner of window with focus */
                    if (XGetInputFocus (display, &window, &revert_to))
                        XGetGeometry (display, window, &root, &x, &y, &width,
                                &height, &border_width, &depth);
                    else
                        exit (EXIT_SUCCESS);
                    break;

                default:
                    usage (argv[0]);
                    exit (EXIT_FAILURE);
            }
            XWarpPointer (display, None,
                    RootWindow (display, DefaultScreen (display)), 0, 0,
                    0, 0, x, y);
            XSetInputFocus (display, PointerRoot, RevertToPointerRoot,
                    CurrentTime);
            XCloseDisplay (display);
        } else {
            fprintf (stderr, "%s: failed to open display '%s'\n", argv[0],
                    display_name);
            exit (EXIT_FAILURE);
        }
    } else {
        fprintf (stderr, "%s: failed to get display; DISPLAY is not set\n",
                argv[0]);
        exit (EXIT_FAILURE);
    }

    exit (EXIT_SUCCESS);
}