Esempio n. 1
0
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);
}
Esempio n. 2
0
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
Esempio n. 3
0
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);
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
/* 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 */
}
Esempio n. 6
0
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);
}