X11에서 Pointer를 이동하는 예제

개발 노트 2008. 7. 1. 10:47 posted by 무병장수권력자


출처 : 기억 안남 (code project 였을 듯)

main.c
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void
usage(const char *err, ...)
{
    va_list va;
    va_start(va, err);
    fprintf(stderr, "ERROR: ");
    vfprintf(stderr, err, va);
    va_end(va);
    fprintf(stderr, "\n"
"usage: xwarppointer <command> <args>\n\n"
" commands:\n"
"   screen <+/-> | <screen #>       Move cursor to specific screen, or        \n"
"                                   relative to current one. Does not change  \n"
"                                   the cursor's position on the screen.      \n"
"\n"
"   abspos <x|.> <y|.>              Moves cursor to given X and Y coordinates.\n"
"                                   If . is specified instead of a #, it      \n"
"                                   doesn't change that axis.                 \n"
"\n"
"   relpos <x offset> <y offset>    Move the cursor relative to its current   \n"
"                                   position.                                 \n"
"\n"
"   get                             Return the cursors position.              \n"
"\n");
    exit(1);
}
int
myatoi(const char *str, int *ret) {
    char *p;
    int i;
    i = strtod(str, &p);
    if (p == str)
 return 0;
    *ret = i;
    return 1;
}
int
main(int argc, char *argv[])
{
    Display *display;
    Window root;
   
    if ((display = XOpenDisplay(NULL)) == NULL) {
 fprintf(stderr, "Cannot open local X-display.\n");
 exit(1);
    }
    root = DefaultRootWindow(display);
    if (argc < 2) usage("wrong number of args");
    if (!strcasecmp(argv[1], "screen")) {
 Window fromroot, tmpwin;
 XWindowAttributes attr;
 int screen = -1, rot, x, y, tmp;
 if (argc != 3)
     usage("screen: wrong number of args");
 if (*argv[2] == '+')
     rot = 1;
 else if (*argv[2] == '-')
     rot = -1;
 else
     screen = atoi(argv[2]);
 XQueryPointer(display, root, &fromroot, &tmpwin, &x, &y, &tmp, &tmp, &tmp);
 if (screen == -1) {
     XGetWindowAttributes(display, fromroot, &attr);
     screen = XScreenNumberOfScreen(attr.screen);
     screen += rot;
     if (screen >= ScreenCount(display))
  screen -= ScreenCount(display);
     if (screen < 0)
  screen += ScreenCount(display);
 } else {
     if (screen >= ScreenCount(display) || screen < 0) {
  fprintf(stderr, "Cannot get root window of screen!\n");
  exit(1);
     }
 }
 root = RootWindow(display, screen);
 XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
 XFlush(display);
    } else if (!strcasecmp(argv[1], "abspos")) {
 int x, y, tmp;
 Window fromroot, tmpwin;
 if (argc != 4)
     usage("abspos: wrong number of args");
 XQueryPointer(display, root, &fromroot, &tmpwin, &x, &y, &tmp, &tmp, &tmp);
 if (argv[2][0] != '.')
     if (!myatoi(argv[2], &x))
  usage("abspos: invalid x pos: %s", argv[2]);
 if (argv[3][0] != '.')
     if (!myatoi(argv[3], &y))
  usage("abspos: invalid y pos: %s", argv[3]);
 XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
 XFlush(display);
    } else if (!strcasecmp(argv[1], "relpos")) {
 int x, y, tmp, x2, y2;
 Window fromroot, tmpwin;
 if (argc != 4)
     usage("relpos: wrong number of args");
 XQueryPointer(display, root, &fromroot, &tmpwin, &x, &y, &tmp, &tmp, &tmp);
 if (!myatoi(argv[2], &x2)) usage("relpos: invalid x pos: %s", argv[2]);
 if (!myatoi(argv[3], &y2)) usage("relpos: invalid y pos: %s", argv[3]);
 x += x2;
 y += y2;
 XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
 XFlush(display);
    } else if (!strcasecmp(argv[1], "get")) {
 int x, y, tmp;
 Window fromroot, tmpwin;
 if (argc != 2)
     usage("get: wrong number of args");
 XQueryPointer(display, root, &fromroot, &tmpwin, &x, &y, &tmp, &tmp, &tmp);
 printf("%d %d\n", x, y);
    } else {
 usage("invalid command: %s", argv[1]);
    }
    exit(0);
}