Please bear with us as we work to restore functionality to dotfiles.org.
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);
}