void wxeEvtListener::forward(wxEvent& event) { #ifdef DEBUG if(!sendevent(&event, port)) fprintf(stderr, "Couldn't send event!\r\n"); #else sendevent(&event, port); #endif }
void killclient(Arg *arg) { if(!sel) return; if(isprotodel(sel)) sendevent(sel->win, wmatom[WMProtocols], wmatom[WMDelete]); else XKillClient(dpy, sel->win); }
static void fake_keypress(ulong mod, KeyCode key) { XKeyEvent e; Client *c; c = disp.focus; if(c == nil || c->w.xid == 0) return; e.time = event_xtime; e.window = c->w.xid; e.state = mod; e.keycode = key; e.type = KeyPress; sendevent(&c->w, true, KeyPressMask, (XEvent*)&e); e.type = KeyRelease; sendevent(&c->w, true, KeyReleaseMask, (XEvent*)&e); sync(); }
static void keyevent(Window w, unsigned code, int type) { XKeyEvent e; e.display = dpy; e.window = w; e.root = root; e.subwindow = None; e.time = CurrentTime; e.x = e.y = e.x_root = e.y_root = 1; e.same_screen = True; e.keycode = code; e.state = modifiers; e.type = type; sendevent(w, KeyPressMask, (XEvent*)&e); }
static void buttonevent(unsigned button, int type) { XButtonEvent e; memset(&e, 0, sizeof(e)); e.button = button; e.type = type; e.same_screen = True; e.subwindow = root; e.state = modifiers; do { e.window = e.subwindow; XQueryPointer(dpy, e.window, &e.root, &e.subwindow, &e.x_root, &e.y_root, &e.x, &e.y, &e.state); } while(e.subwindow); sendevent(PointerWindow, ButtonPressMask, (XEvent*)&e); }
// TODO: Change to only use this routine when using a relative mouse // pointer to fake absolute mouse moves. Otherwise, don't worry about // current position of the mouse and just send an absolute mouse pointer // event. void sendSpringEvent(PadderCommon::springModeInfo *fullSpring, PadderCommon::springModeInfo *relativeSpring, int* const mousePosX, int* const mousePosY) { PadderCommon::mouseHelperObj.mouseTimer.stop(); if ((fullSpring->displacementX >= -2.0 && fullSpring->displacementX <= 1.0 && fullSpring->displacementY >= -2.0 && fullSpring->displacementY <= 1.0) || (relativeSpring && (relativeSpring->displacementX >= -2.0 && relativeSpring->displacementX <= 1.0 && relativeSpring->displacementY >= -2.0 && relativeSpring->displacementY <= 1.0))) { int xmovecoor = 0; int ymovecoor = 0; int width = 0; int height = 0; int midwidth = 0; int midheight = 0; int destSpringWidth = 0; int destSpringHeight = 0; int destMidWidth = 0; int destMidHeight = 0; int currentMouseX = 0; int currentMouseY = 0; //QDesktopWidget deskWid; if (fullSpring->screen >= PadderCommon::mouseHelperObj.getDesktopWidget()->screenCount()) { fullSpring->screen = -1; } QRect deskRect = PadderCommon::mouseHelperObj.getDesktopWidget()->screenGeometry(fullSpring->screen); width = deskRect.width(); height = deskRect.height(); #if defined(Q_OS_UNIX) && defined(WITH_X11) QPoint currentPoint; #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) if (QApplication::platformName() == QStringLiteral("xcb")) { #endif currentPoint = X11Extras::getInstance()->getPos(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) } else { currentPoint = QCursor::pos(); } #endif #else QPoint currentPoint = QCursor::pos(); #endif currentMouseX = currentPoint.x(); currentMouseY = currentPoint.y(); midwidth = width / 2; midheight = height / 2; int springWidth = fullSpring->width; int springHeight = fullSpring->height; if (springWidth >= 2 && springHeight >= 2) { destSpringWidth = qMin(springWidth, width); destSpringHeight = qMin(springHeight, height); } else { destSpringWidth = width; destSpringHeight = height; } destMidWidth = destSpringWidth / 2; destMidHeight = destSpringHeight / 2; unsigned int pivotX = currentMouseX; unsigned int pivotY = currentMouseY; if (relativeSpring) { if (PadderCommon::mouseHelperObj.pivotPoint[0] != -1) { pivotX = PadderCommon::mouseHelperObj.pivotPoint[0]; } else { pivotX = currentMouseX; } if (PadderCommon::mouseHelperObj.pivotPoint[1] != -1) { pivotY = PadderCommon::mouseHelperObj.pivotPoint[1]; } else { pivotY = currentMouseY; } } xmovecoor = (fullSpring->displacementX >= -1.0) ? (midwidth + (fullSpring->displacementX * destMidWidth) + deskRect.x()): pivotX; ymovecoor = (fullSpring->displacementY >= -1.0) ? (midheight + (fullSpring->displacementY * destMidHeight) + deskRect.y()) : pivotY; unsigned int fullSpringDestX = xmovecoor; unsigned int fullSpringDestY = ymovecoor; unsigned int destRelativeWidth = 0; unsigned int destRelativeHeight = 0; if (relativeSpring && relativeSpring->width >= 2 && relativeSpring->height >= 2) { destRelativeWidth = relativeSpring->width; destRelativeHeight = relativeSpring->height; int xRelativeMoovCoor = 0; if (relativeSpring->displacementX >= -1.0) { xRelativeMoovCoor = (relativeSpring->displacementX * destRelativeWidth) / 2; } int yRelativeMoovCoor = 0; if (relativeSpring->displacementY >= -1.0) { yRelativeMoovCoor = (relativeSpring->displacementY * destRelativeHeight) / 2; } xmovecoor += xRelativeMoovCoor; ymovecoor += yRelativeMoovCoor; } if (mousePosX) { *mousePosX = xmovecoor; } if (mousePosY) { *mousePosY = ymovecoor; } if (xmovecoor != currentMouseX || ymovecoor != currentMouseY) { double diffx = abs(currentMouseX - xmovecoor); double diffy = abs(currentMouseY - ymovecoor); // If either position is set to center, force update. if (xmovecoor == (deskRect.x() + midwidth) || ymovecoor == (deskRect.y() + midheight)) { #if defined(Q_OS_UNIX) BaseEventHandler *handler = EventHandlerFactory::getInstance()->handler(); if (fullSpring->screen <= -1) { if (handler->getIdentifier() == "xtest") { EventHandlerFactory::getInstance()->handler()->sendMouseAbsEvent(xmovecoor, ymovecoor); } else if (handler->getIdentifier() == "uinput") { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } } else { EventHandlerFactory::getInstance()->handler()->sendMouseEvent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #elif defined(Q_OS_WIN) if (fullSpring->screen <= -1) { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } else { sendevent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #endif } else if (!PadderCommon::mouseHelperObj.springMouseMoving && relativeSpring && (relativeSpring->displacementX >= -1.0 || relativeSpring->displacementY >= -1.0) && (diffx >= destRelativeWidth*.013 || diffy >= destRelativeHeight*.013)) { PadderCommon::mouseHelperObj.springMouseMoving = true; #if defined(Q_OS_UNIX) BaseEventHandler *handler = EventHandlerFactory::getInstance()->handler(); if (fullSpring->screen <= -1) { if (handler->getIdentifier() == "xtest") { EventHandlerFactory::getInstance()->handler()->sendMouseAbsEvent(xmovecoor, ymovecoor); } else if (handler->getIdentifier() == "uinput") { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } } else { EventHandlerFactory::getInstance()->handler()->sendMouseEvent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #elif defined(Q_OS_WIN) if (fullSpring->screen <= -1) { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } else { sendevent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #endif PadderCommon::mouseHelperObj.mouseTimer.start( qMax(JoyButton::getMouseRefreshRate(), JoyButton::getGamepadRefreshRate()) + 1); } else if (!PadderCommon::mouseHelperObj.springMouseMoving && (diffx >= destSpringWidth*.013 || diffy >= destSpringHeight*.013)) { PadderCommon::mouseHelperObj.springMouseMoving = true; #if defined(Q_OS_UNIX) BaseEventHandler *handler = EventHandlerFactory::getInstance()->handler(); if (fullSpring->screen <= -1) { if (handler->getIdentifier() == "xtest") { EventHandlerFactory::getInstance()->handler()->sendMouseAbsEvent(xmovecoor, ymovecoor); } else if (handler->getIdentifier() == "uinput") { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } } else { EventHandlerFactory::getInstance()->handler()->sendMouseEvent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #elif defined(Q_OS_WIN) if (fullSpring->screen <= -1) { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } else { sendevent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #endif PadderCommon::mouseHelperObj.mouseTimer.start( qMax(JoyButton::getMouseRefreshRate(), JoyButton::getGamepadRefreshRate()) + 1); } else if (PadderCommon::mouseHelperObj.springMouseMoving && (diffx < 2 && diffy < 2)) { PadderCommon::mouseHelperObj.springMouseMoving = false; } else if (PadderCommon::mouseHelperObj.springMouseMoving) { #if defined(Q_OS_UNIX) BaseEventHandler *handler = EventHandlerFactory::getInstance()->handler(); if (fullSpring->screen <= -1) { if (handler->getIdentifier() == "xtest") { EventHandlerFactory::getInstance()->handler()->sendMouseAbsEvent(xmovecoor, ymovecoor); } else if (handler->getIdentifier() == "uinput") { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } } else { EventHandlerFactory::getInstance()->handler()->sendMouseEvent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #elif defined(Q_OS_WIN) if (fullSpring->screen <= -1) { EventHandlerFactory::getInstance()->handler() ->sendMouseSpringEvent(xmovecoor, ymovecoor, width, height); } else { sendevent(xmovecoor - currentMouseX, ymovecoor - currentMouseY); } #endif PadderCommon::mouseHelperObj.mouseTimer.start( qMax(JoyButton::getMouseRefreshRate(), JoyButton::getGamepadRefreshRate()) + 1); } PadderCommon::mouseHelperObj.previousCursorLocation[0] = currentMouseX; PadderCommon::mouseHelperObj.previousCursorLocation[1] = currentMouseY; PadderCommon::mouseHelperObj.pivotPoint[0] = fullSpringDestX; PadderCommon::mouseHelperObj.pivotPoint[1] = fullSpringDestY; } else if (PadderCommon::mouseHelperObj.previousCursorLocation[0] == xmovecoor && PadderCommon::mouseHelperObj.previousCursorLocation[1] == ymovecoor) { PadderCommon::mouseHelperObj.springMouseMoving = false; } else { PadderCommon::mouseHelperObj.previousCursorLocation[0] = currentMouseX; PadderCommon::mouseHelperObj.previousCursorLocation[1] = currentMouseY; PadderCommon::mouseHelperObj.pivotPoint[0] = fullSpringDestX; PadderCommon::mouseHelperObj.pivotPoint[1] = fullSpringDestY; PadderCommon::mouseHelperObj.mouseTimer.start( qMax(JoyButton::getMouseRefreshRate(), JoyButton::getGamepadRefreshRate()) + 1); } } else { PadderCommon::mouseHelperObj.springMouseMoving = false; PadderCommon::mouseHelperObj.pivotPoint[0] = -1; PadderCommon::mouseHelperObj.pivotPoint[1] = -1; } }
void shutdown (void) { sendevent ("shutdown"); shutcond.wait (); }
int main(int argc, char* argv[]) { if (argc > 6) { print_usage(); return 2; } char* eventFilePath = NULL; int repeat = 1; int interval = -1; int repeatInterval = 1000; for (int i = 1; i < argc; i++) { char* arg = *(argv + i); if (!strncmp(arg, "-r:", 3)) { repeat = atoi(arg + 3); } else if (!strncmp(arg, "-i:", 3)) { interval = atoi(arg + 3) * 1000; } else if (!strncmp(arg, "-ri:", 4)) { repeatInterval = atoi(arg + 4) * 1000; } else if (!strcmp(arg, "-d")) { gDebug = 1; } else if (!strcmp(arg, "-h")) { print_usage(); return 0; } else if (!strcmp(arg, "-rec")) { return recordEvent("./event_queue"); } else if (!strncmp(arg, "-rec:", 5)) { return recordEvent(arg + 5); } else { if (i == 1 && strncmp(arg, "-", 1)) { eventFilePath = argv[1]; } else { printf("Unkown parameter %s\n", arg); print_usage(); return 2; } } } memset(gFds, 0, sizeof(device_fd_map_t) * MAX_FD); if (repeat >= MAX_REPEAT) { printf("Repeat times %d limit exceed.\n", MAX_REPEAT - 1); } printf("Play with REPEATE=%d, INTERVAL=%d\n", repeat, interval); // control the repeat for (int r = 0; r != repeat; r = (r + 1) % MAX_REPEAT) { // open recorded event queue. FILE* file = NULL; if (eventFilePath) { file = fopen(eventFilePath, "rt"); if (!file) { printf("Can not open file %s, is it exists?\n", eventFilePath); return 1; } } else { printf(">> No event file specified. Using stdin instead. <<\n"); file = stdin; if (repeat != 1) { printf("WARNING: -r parameters can not be used while using stdin.\n"); printf(" Reseting to -r:1\n"); repeat = 1; } } char* first,* last; char buffer[1024]; int sec = 0, usec = 0; char devicePath[256]; unsigned int type = 0, code = 0, arg = 0; usecs_t timeOffset = 0; bool timeOffsetSet = false; usecs_t lastEventTime = 0; // starts playback while (fgets(buffer, 1024, file) != NULL) { sec = usec = -1; PRINT_IF(gDebug, "Parsing %s\n", buffer); splite(buffer, &first, &last); // try android 4.0 output style sscanf(first, "%d-%d: %s", &sec, &usec, devicePath); if (sec == -1 || usec == -1) { //try android 4.1 & 4.2 output style sscanf(first, "[%d.%d] %s", &sec, &usec, devicePath); if (sec == -1 || usec == -1) { printf("Skiping invalid line: %s\n", buffer); continue; // This line is not a valid event record } } sscanf(last, "%x %x %x", &type, &code, &arg); PRINT_IF(gDebug, "Event Timestamp=%d.%ds\n", sec, usec); int fd = getOrOpenFd(devicePath); // Calculating times to sleep usecs_t sleepTime = 0; // event time stamp usecs_t time = combineTime(sec, usec); if (!timeOffsetSet) { timeOffsetSet = true; timeOffset = systemTime() - time; } sleepTime = (time + timeOffset) - systemTime(); if (interval > 0) { usleep(interval); } else if (interval == 0) { } else if (sleepTime > 0) { PRINT_IF(gDebug || sleepTime > 1000000 /* 1s */, "Sleep %lld.%llds\n", sleepTime / 1000000, sleepTime % 1000000); usleep(sleepTime); } PRINT_IF(gDebug, "-> %s: %d, %d, %d\n", devicePath, type, code, arg); if (sendevent(fd, type ,code, arg) != 0) exit(0); } fclose(file); if (repeat < 0) printf ("Done playback [ %d / Forever ]\n", r + 1); else printf ("Done playback [ %d / %d ]\n", r + 1, repeat); if (repeatInterval > 0 && r + 1 != repeat) usleep(repeatInterval); } clearFds(); printf("All done\n"); exit(0); }