Hello everybody,

i am really new in XServer programming. At the moment,
i am trying to write my mouse robot.

That's what i have done so far:

#include <stdlib.h>
#include <errno.h>
#include <string.h>

#include <X11/Xlib.h>
#include <X11/Xutil.h>

#include <math.h>
#include <stdio.h>
#include <time.h>

#define DEFAULT_XSERVER_ADDR ":0.0"

static Display *display = NULL;
static Window *rootWindow = NULL;

static int robot_state = 0;

int robot_is_inited() {
   return robot_state;
}

void robot_init(const char* xserver) {
   if (!robot_state) {
      if (xserver == NULL) {
         return;
      }
      display = XOpenDisplay(xserver);
      rootWindow = &DefaultRootWindow(display);

      robot_state = 1;
      return;
   }
   return;
   robot_state = 1;
}

void robot_destroy() {
   if (robot_state) {
      XCloseDisplay(display);
   }
   robot_state = 0;
}

void robot_move_mouse(int x, int y) {
   if (robot_state) {
      printf("move to %i,%i\n", x, y);
      XWarpPointer(display, None, *rootWindow, 0, 0, 0, 0, x, y);
      XFlush(display);
   }
}

static void clickMouse_internal(int button) {
   XEvent event;
   if (robot_state) {
      memset(&event, 0x00, sizeof(event));
      event.type = ButtonPress;
      event.xbutton.button = button;
      event.xbutton.same_screen = True;

      XQueryPointer(display, *rootWindow, &event.xbutton.root,
            &event.xbutton.window, &event.xbutton.x_root,
            &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y,
            &event.xbutton.state);

      event.xbutton.subwindow = event.xbutton.window;
      while (event.xbutton.subwindow) {
         event.xbutton.window = event.xbutton.subwindow;
         XQueryPointer(display, event.xbutton.window, &event.xbutton.root,
               &event.xbutton.subwindow, &event.xbutton.x_root,
               &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y,
               &event.xbutton.state);
      }

      if (XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) {
      } else {
         XFlush(display);
      }
   }
}

static void releaseMouse_internal(int button) {
   XEvent event;
   if (robot_state) {
      memset(&event, 0x00, sizeof(event));
      event.type = ButtonRelease;
      event.xbutton.button = button;
      event.xbutton.same_screen = True;

      XQueryPointer(display, *rootWindow, &event.xbutton.root,
            &event.xbutton.window, &event.xbutton.x_root,
            &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y,
            &event.xbutton.state);

      event.xbutton.subwindow = event.xbutton.window;
      while (event.xbutton.subwindow) {
         event.xbutton.window = event.xbutton.subwindow;
         XQueryPointer(display, event.xbutton.window, &event.xbutton.root,
               &event.xbutton.subwindow, &event.xbutton.x_root,
               &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y,
               &event.xbutton.state);
      }
      if (XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) {
      } else {
         XFlush(display);
      }
   }
}

void robot_release_mouse_button1() {
   releaseMouse_internal(Button1);
}

void robot_press_mouse_button1() {
   clickMouse_internal(Button1);
}

void testRobot() {
   int x = 400;
   int y = 300;
   robot_init(DEFAULT_XSERVER_ADDR);
   if (robot_is_inited()) {
      sleep(1);
      robot_move_mouse(x, y);
      robot_press_mouse_button1();
      sleep(1);
      robot_move_mouse(x + 10, y + 10);
      sleep(1);
      robot_move_mouse(x + 50, y + 50);
      sleep(1);

      //      for (int i = 0; i < 50; i+=2) {
      //         robot_move_mouse(x + i, y + i);
      //         usleep(10000);
      //      }
      robot_release_mouse_button1();
      robot_destroy();
   } else {
      printf("robot not initiated");
   }
}

int main() {

   testRobot();
   return 0;
}

But there is something wrong: When i move the pointer to 10:10,
fire a mouse pressed event, move the pointer afterwards to 50:50
and fire mouse relased event, it should be a mouse dragged event.
On Gnome desktop, everything is fine. Icons, which are in the rectangle,
get marked.
If the unterlying window is for example Gimp, there should be a
line drawed from 10:10 to 50:50. But the line is not drawed.
Instead, only the first dot is drawed at 10:10.

How do i implement a correct mouse dragged event, so it also
works with painting applications such as Gimp?

With kind regards
André Geisler
_______________________________________________
xorg@lists.freedesktop.org: X.Org support
Archives: http://lists.freedesktop.org/archives/xorg
Info: http://lists.freedesktop.org/mailman/listinfo/xorg
Your subscription address: arch...@mail-archive.com

Reply via email to