void event_callback(XPointer priv, XRecordInterceptData *hook) { /* FIXME: we need use XQueryPointer to get the first location */ static int cur_x = 0; static int cur_y = 0; if (hook->category != XRecordFromServer) { XRecordFreeData (hook); return; } XRecordDatum *data = (XRecordDatum*) hook->data; int event_type = data->type; BYTE btncode, keycode; btncode = keycode = data->event.u.u.detail; int rootx = data->event.u.keyButtonPointer.rootX; int rooty = data->event.u.keyButtonPointer.rootY; int time = hook->server_time; switch (event_type) { case KeyPress: /* if escape is pressed, stop the loop and clean up, then exit */ if (keycode == 9) stop = 1; /* Note: you should not use data_disp to do normal X operations !!!*/ printf ("KeyPress: \t%s\n", XKeysymToString(XKeycodeToKeysym(ctrl_disp, keycode, 0))); break; case KeyRelease: printf ("KeyRelease: \t%s\n", XKeysymToString(XKeycodeToKeysym(ctrl_disp, keycode, 0))); break; case ButtonPress: /* printf ("ButtonPress: /t%d, rootX=%d, rootY=%d", btncode, cur_x, cur_y); */ break; case ButtonRelease: /* printf ("ButtonRelease: /t%d, rootX=%d, rootY=%d", btncode, cur_x, cur_y); */ break; case MotionNotify: /* printf ("MouseMove: /trootX=%d, rootY=%d",rootx, rooty); */ cur_x = rootx; cur_y = rooty; break; case CreateNotify: break; case DestroyNotify: break; case NoExpose: break; case Expose: break; default: break; } printf (", time=%d\n", time); XRecordFreeData (hook); }
static void keyhookCallback(XPointer priv, XRecordInterceptData *data) { const xEvent *xev = (const xEvent *) data->data; if (data->category == XRecordFromServer) { const BYTE keycode = xev->u.u.detail; if (xev->u.u.type == KeyPress) { // !!! FIXME: don't hardcode these keycodes. if ((keycode == 64) && (keyPressFlags == 0)) keyPressFlags++; else if ((keycode == 133) && (keyPressFlags == 1)) keyPressFlags++; else if ((keycode == 51) && (keyPressFlags == 2)) { sawKeyCombo = 1; keyPressFlags = 0; } // else if else keyPressFlags = 0; } // if else if (xev->u.u.type == KeyRelease) { keyPressFlags = 0; } // else if } // if XRecordFreeData(data); } // keyhookCallback
static void grab_key_event_cb (XPointer user_data, XRecordInterceptData *hook) { if ( hook->category != XRecordFromServer ) { XRecordFreeData(hook); g_warning ("Data not from X server..."); return; } int event_type = hook->data[0]; KeyCode keycode = hook->data[1]; /*g_debug ("event type: %d, code: %d\n", (int)event_type, (int)keycode);*/ switch (event_type) { case KeyPress: key_press_cnt++; break; case KeyRelease: /*g_debug ("key_press_cnt: %d\n", key_press_cnt);*/ if (key_press_cnt == 1) { exec_action (keycode); } key_press_cnt = 0; break; default: key_press_cnt = 0; break; } XRecordFreeData(hook); }
static void callback(XPointer trash, XRecordInterceptData* data) { printf("%d ", data->category); /* switch (data->category) { case XRecordStartOfData: case XRecordFromClient: case XRecordClientStarted: case XRecordClientDied: case XRecordEndOfData: break; */ if (data->category == XRecordFromServer) { //xEvent * event = (xEvent *)data->data; XEvent * event = (XEvent *)data->data; if (event->type == KeyPress || event->type == KeyRelease) { // XEvent, XKeyEvent, XAnyEvent if (event->type == KeyPress) { printf("KeyPress"); } else if (event->type == KeyRelease) { printf("KeyRelease"); } printf(" %d", event->xkey.keycode); } else if (event->type == ButtonPress || event->type == ButtonRelease) { printf("ButtonPress/Release"); } else if (event->type == MotionNotify) { printf("Motion"); } } else if (data->category == XRecordStartOfData) { printf("Start of Data"); } printf("\n"); fflush(stdout); XRecordFreeData(data); }
/* called by XRecordProcessReplies() */ void xrecord_callback(XPointer closure, XRecordInterceptData * recorded_data) { struct xrecord_callback_results *cbres; xEvent *xev; int nxev; cbres = (struct xrecord_callback_results *) closure; if (recorded_data->category != XRecordFromServer) { XRecordFreeData(recorded_data); return; } nxev = recorded_data->data_len / 8; xev = (xEvent *) recorded_data->data; while (nxev--) { if ((xev->u.u.type == KeyPress) || (xev->u.u.type == KeyRelease)) { int i; int is_modifier = 0; cbres->key_event = 1; /* remember, a key was pressed or released. */ /* test if it was a modifier */ for (i = 0; i < 8 * cbres->modifiers->max_keypermod; i++) { KeyCode kc = cbres->modifiers->modifiermap[i]; if (kc == xev->u.u.detail) { is_modifier = 1; /* yes, it is a modifier. */ break; } } if (is_modifier) { if (xev->u.u.type == KeyPress) { for (i = 0; i < MAX_MODIFIERS; ++i) if (!cbres->pressed_modifiers[i]) { cbres->pressed_modifiers[i] = xev->u.u.detail; break; } } else { /* KeyRelease */ for (i = 0; i < MAX_MODIFIERS; ++i) if (cbres->pressed_modifiers[i] == xev->u.u.detail) cbres->pressed_modifiers[i] = 0; } } else { /* remember, a non-modifier was pressed. */ cbres->non_modifier_event = 1; } } xev++; } XRecordFreeData(recorded_data); /* cleanup */ }
void EventCallback(XPointer p, XRecordInterceptData *idata) { if (XRecordFromServer == idata->category) { GUIRecord *grecord = (GUIRecord *) p; Display *disp = grecord->disp; Display *display = grecord->disp; //Display *disp = (Display *)p; xEvent *xev = (xEvent *)idata->data; int type = xev->u.u.type; int keyPress = 0; timeval now; gettimeofday(&now, NULL); long secDiff = (now.tv_sec - grecord->evt.now.tv_sec); long usecDiff = ((now.tv_usec - grecord->evt.now.tv_usec) / 1000); long delay = ((secDiff * 1000) + usecDiff); grecord->evt.delay = delay; grecord->evt.now = now; //printf("DEBUG: delay = %ld\n",delay); debug()<<"event: "<<type<<std::endl; switch (type) { case ButtonPress: { int button = xev->u.u.detail; // 1=left, 2=middle, 3=right, 4=up, 5=down //printf("DEBUG: onMouseDown %d @ (%d,%d)\n", button, grecord->evt.x, grecord->evt.y); int x = xev->u.keyButtonPointer.rootX, y = xev->u.keyButtonPointer.rootY; grecord->evt.x = x; grecord->evt.y = y; grecord->onMouseDown(button, x, y); //-- Window focus_return; //-- int revert_to_return; //-- XGetInputFocus(disp, &focus_return, &revert_to_return); //-- std::cout<<"Focus Window Press:"<<focus_return<<' '<<revert_to_return<<std::endl; /* // Below values Has no much meaning Window event_w = xev->u.keyButtonPointer.event; Window event_r = xev->u.keyButtonPointer.root; Window event_c = xev->u.keyButtonPointer.child; int event_x = xev->u.keyButtonPointer.eventX; int event_y = xev->u.keyButtonPointer.eventY; int root_x = xev->u.keyButtonPointer.rootX; int root_y = xev->u.keyButtonPointer.rootY; std::cout<<"mouse press: "<<(event_w)<<'/'<<event_r<<'/'<<event_c<<' '<<event_x<<' '<<event_y<<' '<<root_x<<' '<<root_y<<' '<<None<<std::endl; / */ } break; case ButtonRelease: { int button = xev->u.u.detail; //printf("DEBUG: onMouseUp %d @ (%d,%d)\n", button, grecord->evt.x, grecord->evt.y); int x = xev->u.keyButtonPointer.rootX, y = xev->u.keyButtonPointer.rootY; grecord->evt.x = x; grecord->evt.y = y; grecord->onMouseUp(button, x, y); } break; case KeyPress: { KeyCode kc = xev->u.u.detail; //-- KeySym ks = XKeycodeToKeysym(disp, kc, 0); //-- const char *kchar = XKeysymToString(ks); //-- printf("onKeyPress %d %s\n", kc, kchar); grecord->keystroke(kc, true); } break; case KeyRelease: { KeyCode kc = xev->u.u.detail; KeySym ks = XKeycodeToKeysym(disp, kc, 0); //KeySym ks2 = XKeycodeToKeysym(disp, kc, 1); //printf("DEBUG: keysym %d %d\n",ks,ks2); const char *kchar = XKeysymToString(ks); //printf("DEBUG: onKeyUp %d %s\n", kc, kchar); if(strcmp(kchar, "Escape")==0){ grecord->stop(); } //std::cout<<"keyup "<<kchar<<std::endl; grecord->keystroke(kc,false); } break; case MotionNotify: { int x = xev->u.keyButtonPointer.rootX; int y = xev->u.keyButtonPointer.rootY; //grecord->evt.d += abs(x - grecord->evt.x) + abs(y - grecord->evt.y); grecord->evt.d += abs(x - grecord->evt.x) + abs(y - grecord->evt.y); grecord->evt.x = x; grecord->evt.y = y; grecord->onMouseMove(x,y); } break; case EnterNotify: printf("onEnter\n"); break; case LeaveNotify: printf("onLeave\n"); break; case FocusIn: { Window focus_win = xev->u.focus.window; grecord->flushMouse(); Window focus_return; int revert_to_return; XGetInputFocus(display, &focus_return, &revert_to_return); if(focus_win == focus_return){ grecord->evt.w = focus_win; int wx, wy; print_window_attrs(display, focus_win, wx, wy); int xdot_x = wx-7, xdot_y = wy-24; std::cout<<"xdotool getwindowfocus getwindowgeometry windowmove --sync "<<xdot_x<<' '<<xdot_y<<" getwindowgeometry"<<std::endl; // TODO: add size support // xdotool getwindowfocus getwindowgeometry windowmove 292 94 getwindowgeometry //xdo_window_move(display, focus_win, wx, wy); //print_window_attrs(display, focus_win, wx, wy); //--XGetGeometry(display, root_return, &root_return, &x_return, &y_return, &width_return, //-- &height_return, &border_width_return, &depth_return); //--debug()<<"win root "<<x_return<<' '<<y_return<<' '<<width_return<<' '<<height_return<<std::endl; /* XWindowAttributes attr; XGetWindowAttributes(display, focus_win, &attr); XTranslateCoordinates(xdo->xdpy, focus_win, attr.root, attr.x, attr.y, &root_x, &root_y, &unused_child); debug()<<"root "<<win_x<<','<<win_y<<' '<<root_x<<','<<root_y<<std::endl; */ } //TODO: handle more on window stack change } break; case FocusOut: { grecord->flushMouse(); Window focus_win = xev->u.focus.window; if(grecord->evt.w == focus_win){ char *wname; XFetchName(display, focus_win, &wname); debug()<<"FocusOut Window: "<<focus_win<<' '<<wname<<std::endl; grecord->evt.w = 0; } } break; case KeymapNotify: case Expose: case GraphicsExpose: case NoExpose: break; case CreateNotify: case DestroyNotify: break; case MapNotify: debug()<<"MapNotify Window"<<std::endl; break; case UnmapNotify: debug()<<"UnmapNotify Window"<<std::endl; break; case ConfigureNotify: { int w_window = xev->u.configureRequest.window; int w_x = xev->u.configureRequest.x; int w_y = xev->u.configureRequest.y; int w_w = xev->u.configureRequest.width; int w_h = xev->u.configureRequest.height; debug()<<"Config Window: "<<w_window<<" @ ("<<w_x<<','<<w_y<<") "<<w_w<<'x'<<w_h<<std::endl; } break; case PropertyNotify:{ // it's possible Copy action } break; case SelectionRequest: { // INFO: use SelectionRequest when Paste } break; default: //std::cout<<"event type: "<<type<<std::endl; break; } //// //HandleEvent(re); //// } if (idata != NULL) XRecordFreeData(idata); }