On Fri, Jul 18, 2003 at 12:28:46PM -0700, Jeremy C. Reed wrote:
> I recall someone mentioning on the list about a software that could be
> programmed to simulate pointer movements and clicks.
> 

xwarppointer.c (attached, 5k) was mentioned. i dont recall if a url was 
given to point to this file, and the header on it doesnt mention a 
source website. i found similar things via google, but not the same one.

xbut was also mentioned at some point (i believe the same thread) for
generating button events. the readme cites http://www.sandklef.com/xbut/
as it's home.

Russ

-- 
=======================================================================
| Russ Burdick | "What do the good know...except what the             |
|===============  bad teach them by their excesses?" -Clive Barker    |
| [EMAIL PROTECTED]                     http://extrapolation.net |
=======================================================================
/*
 * Simple util to move the X cursor around from the command line.
 * By Éric Tremblay <[EMAIL PROTECTED]>
 *
 * To compile and install:
 * gcc -L /usr/X11/lib -lX11 xwarppointer.c -o /usr/local/bin/xwarppointer
 *
 * Legalese (i think):
 * THIS PROGRAM IS HEREBY RELEASED TO THE PUBLIC DOMAIN, THEREFORE
 * ANYONE ANYWHERE IN THE UNIVERSE OR OTHER LOCATIONS MAY DO WHATEVER HE,
 * SHE, OR IT WANTS WITH THIS CODE.
 * THE AUTHOR (that's me) WILL NOT BE HELD RESPONSIBLE FOR ANY DAMAGE,
 * INCONVENIENCE, ADDICTION, HEART OR LUNG DISEASE, IMPOTENCE, MIGRAINE,
 * MENTAL ILLNESS, TORNADOES, EARTHQUAKES, TOTAL EXTINCTION OF LIFE ON EARTH
 * OR OTHER BAD THINGS THAT MIGHT BE CAUSED BY THE USE OF THIS PROGRAM.
 * 
 */


#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <X11/X.h>
#include <X11/Xlib.h>

#define VERSION_STRING "xwarppointer version 0.001"

#define debug_printf                       /* */
/* #define debug_printf printf                /* */


int isnum (char *str);
void usage (int argc, char *argv []);
void query (Display *dpy, Window w);


int main (int argc, char *argv [])
  {
  Display *dpy;
  Window rootwindow;
  int x, y, w, h, i;
  int relative = 0;
  int xarg = -1;
  int sarg = -1;
  long int sleeptime = 0;
  
  if (argc < 2)
    {
    debug_printf ("usage from argc < 2 check\n");
    usage (argc, argv);
    } /* if */
    
  dpy = XOpenDisplay (NULL);
  if (!dpy)
    {
    fprintf (stderr, "Couldn't open X display.\n");
    exit (1);
    } /* if */
  rootwindow = DefaultRootWindow (dpy);
    
  /* parse command line */
  
  for (i = 1; i < argc; i++)
    {
    debug_printf ("Parsing arg %d of %d '%s'\n", i, argc, argv [i]);
    /* request version info? */
    if (strstr (argv [i], "-v"))
      { printf ("%s\n", VERSION_STRING); exit (0); }

    /* request usage? */
    else if (strstr (argv [i], "-h"))
      { debug_printf ("Usage from -h\n"); usage (argc, argv); }
      
    /* relative placement? */
    else if (strstr (argv [i], "-r"))
      relative = 1;

    /* query? */
    else if (strstr (argv [i], "-q"))
      query (dpy, rootwindow);
      
    /* sleeptime? */
    else if (strstr (argv [i], "-s"))
      {
      if (argc <= i + 1)
        {
        debug_printf ("Usage from -s arg check\n");
        usage (argc, argv);
        } /* if */
      sarg = ++i;
      debug_printf ("sleeptime will be arg %d '%s'\n", i, argv [sarg]);
      if (!isnum (argv [sarg]))
        {
        debug_printf ("usage from -s parameter not being a number\n");
        usage (argc, argv);
        } /* if */
      sleeptime = atol (argv [sarg]);
      } /* else if */

    /* number? */
    else if (isnum (argv [i]))
      {
      debug_printf ("Determined arg %d '%s' will be X\n", i, argv [i]);
      if (argc <= i + 1)
        { debug_printf ("Usage from isnum arg check\n"); usage (argc, argv); }
      xarg = i;
      debug_printf ("arg %d '%s' is X\n", i, argv [i]); x = atoi (argv [i++]);
      debug_printf ("arg %d '%s' is Y\n", i, argv [i]); y = atoi (argv [i]);
      } /* this is the arg for 'x' */
      
    /* don't know wtf is this arg */
    else
      {
      printf ("What is a '%s' ???\n\n", argv [i]);
      debug_printf ("Usage from fallback else");
      usage (argc, argv);
      } /* else */
    } /* for */
    
  if (xarg == -1)
    usage (argc, argv);
    
  /* sleeptime = atol (argv [sarg]);
  x = atoi (argv [xarg]);
  y = atoi (argv [xarg + 1]); */
  
  if (x < 0 && !relative) x = DisplayWidth (dpy, DefaultScreen (dpy)) + x;
  if (y < 0 && !relative) y = DisplayHeight (dpy, DefaultScreen (dpy)) + y;
    
  XWarpPointer (dpy, rootwindow,
                     (relative ? 0 : rootwindow),
                     0, 0,
                     0, 0,
                     x, y);
  
  
  XCloseDisplay (dpy);
  
  debug_printf ("sleeptime == %d\n", (int) sleeptime);
  if (sleeptime)
    usleep ((unsigned long int) sleeptime * 1000);
  
  exit (0);
  return 0;
  } /* main () */


/* checks if string *str is a number */
int isnum (char *str)
  {
  int    result = 1,
         i = 0;
  
  for (; str [i]; i++)
    {
    /* debug_printf ("Checking %c\n", str [i]); */
    if (!strchr ("-0123456789", str [i]))
      {
      result = 0;
      } /* if */
    } /* for */
      
  /* printf ("isnum: checked %s, returned %d\n", str, result); */
  return result;
  } /* isnum */


/* Displays quick usage info */
void usage (int argc, char *argv [])
  {
  printf ("Usage: %s [options] <x> <y>\n\n"
        "    Options:\n"
        "    -r or --relative    Move relative from current position\n"
        "    -q or --query       Report pointer position\n"
        "    -s or --sleep <n>   Sleep <n> milliseconds after moving mouse poin
ter\n"
        "    -v or --version     Duh\n"
        "    -h or --help        Duh\n\n",
        argv [0]);
  exit (1);
  } /* usage () */
  

/* Checks pointer coords and prints them to stdout */
void query (Display *dpy, Window w)
  {
  int x, y, dummy;
  
  XQueryPointer (dpy, w,  &w, &w,
                          &x, &y,
                          &dummy, &dummy,
                          &dummy);

  printf ("%d %d\n", x, y);
  exit (0);
  } /* query () */




-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
List archives:  http://asgardsrealm.net/lurker/splash/index.html
Trouble? Contact [EMAIL PROTECTED]

Reply via email to