Esempio n. 1
0
/* Send the appropriate number of button clicks to emulate scroll wheel */
void
DarwinSendScrollEvents(double scroll_x, double scroll_y) {
    ScreenPtr screen;
    ValuatorMask valuators;

    if (!darwinEvents) {
        DEBUG_LOG(
            "DarwinSendScrollEvents called before darwinEvents was initialized\n");
        return;
    }

    screen = miPointerGetScreen(darwinPointer);
    if (!screen) {
        DEBUG_LOG(
            "DarwinSendScrollEvents called before screen was initialized\n");
        return;
    }

    valuator_mask_zero(&valuators);
    valuator_mask_set_double(&valuators, 4, scroll_y);
    valuator_mask_set_double(&valuators, 5, scroll_x);

    darwinEvents_lock();
    {
        QueuePointerEvents(darwinPointer, MotionNotify, 0,
                           POINTER_RELATIVE, &valuators);
        DarwinPokeEQ();
    }
    darwinEvents_unlock();
}
Esempio n. 2
0
void
DarwinInputReleaseButtonsAndKeys(DeviceIntPtr pDev)
{
    darwinEvents_lock();
    {
        int i;
        if (pDev->button) {
            for (i = 0; i < pDev->button->numButtons; i++) {
                if (BitIsOn(pDev->button->down, i)) {
                    QueuePointerEvents(pDev, ButtonRelease, i,
                                       POINTER_ABSOLUTE,
                                       NULL);
                }
            }
        }

        if (pDev->key) {
            for (i = 0; i < NUM_KEYCODES; i++) {
                if (BitIsOn(pDev->key->down, i + MIN_KEYCODE)) {
                    QueueKeyboardEvents(pDev, KeyRelease, i + MIN_KEYCODE);
                }
            }
        }
        DarwinPokeEQ();
    }
    darwinEvents_unlock();
}
Esempio n. 3
0
void
PtrAddEvent(int buttonMask, int x, int y, rfbClientPtr cl)
{
    int i;
    int valuators[2];
    ValuatorMask mask;
    static int oldButtonMask = 0;

    if (!ptrDevice)
        FatalError("Pointer device not initialized");

    if (cursorPosX != x || cursorPosY != y) {
        valuators[0] = x;
        valuators[1] = y;
        valuator_mask_set_range(&mask, 0, 2, valuators);
        QueuePointerEvents(ptrDevice, MotionNotify, 0, POINTER_ABSOLUTE,
                           &mask);

        cursorPosX = x;
        cursorPosY = y;
    }

    for (i = 0; i < 5; i++) {
        if ((buttonMask ^ oldButtonMask) & (1 << i)) {
            if (buttonMask & (1 << i)) {
                valuator_mask_set_range(&mask, 0, 0, NULL);
                QueuePointerEvents(ptrDevice, ButtonPress, i + 1,
                                   POINTER_RELATIVE, &mask);
            } else {
                valuator_mask_set_range(&mask, 0, 0, NULL);
                QueuePointerEvents(ptrDevice, ButtonRelease, i + 1,
                                   POINTER_RELATIVE, &mask);
            }
        }
    }

    oldButtonMask = buttonMask;
    mieqProcessInputEvents();
}
Esempio n. 4
0
/**
 * Enqueue a motion event.
 *
 */
void
winEnqueueMotion(int x, int y)
{
    int valuators[2];
    ValuatorMask mask;

    valuators[0] = x;
    valuators[1] = y;

    valuator_mask_set_range(&mask, 0, 2, valuators);
    QueuePointerEvents(g_pwinPointer, MotionNotify, 0,
                       POINTER_ABSOLUTE | POINTER_SCREEN, &mask);

}
Esempio n. 5
0
void
DarwinSendTabletEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
                       double pointer_x, double pointer_y,
                       double pressure, double tilt_x,
                       double tilt_y)
{
    ScreenPtr screen;
    ValuatorMask valuators;

    if (!darwinEvents) {
        DEBUG_LOG("%s called before darwinEvents was initialized\n",
                  __FUNCTION__);
        return;
    }

    screen = miPointerGetScreen(pDev);
    if (!screen) {
        DEBUG_LOG("%s called before screen was initialized\n",
                  __FUNCTION__);
        return;
    }

    /* Fix offset between darwin and X screens */
    pointer_x -= darwinMainScreenX + screen->x;
    pointer_y -= darwinMainScreenY + screen->y;

    /* Adjust our pointer location to the [0,1] range */
    pointer_x = pointer_x / (double)screenInfo.width;
    pointer_y = pointer_y / (double)screenInfo.height;

    valuator_mask_zero(&valuators);
    valuator_mask_set_double(&valuators, 0, XQUARTZ_VALUATOR_LIMIT * pointer_x);
    valuator_mask_set_double(&valuators, 1, XQUARTZ_VALUATOR_LIMIT * pointer_y);
    valuator_mask_set_double(&valuators, 2, XQUARTZ_VALUATOR_LIMIT * pressure);
    valuator_mask_set_double(&valuators, 3, XQUARTZ_VALUATOR_LIMIT * tilt_x);
    valuator_mask_set_double(&valuators, 4, XQUARTZ_VALUATOR_LIMIT * tilt_y);

    darwinEvents_lock();
    {
        if (ev_type == ProximityIn || ev_type == ProximityOut) {
            QueueProximityEvents(pDev, ev_type, &valuators);
        } else {
            QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE,
                               &valuators);
        }
        DarwinPokeEQ();
    }
    darwinEvents_unlock();
}
Esempio n. 6
0
void
winMouseButtonsSendEvent(int iEventType, int iButton)
{
    ValuatorMask mask;

    if (g_winMouseButtonMap)
        iButton = g_winMouseButtonMap[iButton];

    valuator_mask_zero(&mask);
    QueuePointerEvents(g_pwinPointer, iEventType, iButton,
                       POINTER_RELATIVE, &mask);

  winDebug("winMouseButtonsSendEvent: iEventType: %d, iButton: %d\n",
           iEventType, iButton);
}
Esempio n. 7
0
void
ExtInputAddEvent(rfbDevInfoPtr dev, int type, int buttons)
{
    ValuatorMask mask;

    if (!dev)
        FatalError("ExtInputDeviceAddEvent(): Invalid argument");

    if (rfbVirtualTablet) {
        int i;
        rfbDevInfoPtr vtDev;

        switch (dev->productID) {
        case rfbGIIDevTypeStylus:
            vtDev = &virtualTabletStylus;
            break;
        case rfbGIIDevTypeEraser:
            vtDev = &virtualTabletEraser;
            break;
        case rfbGIIDevTypeTouch:
            vtDev = &virtualTabletTouch;
            break;
        case rfbGIIDevTypePad:
            vtDev = &virtualTabletPad;
            break;
        default:
            if (stristr(dev->name, "stylus"))
                vtDev = &virtualTabletStylus;
            else if (stristr(dev->name, "eraser"))
                vtDev = &virtualTabletEraser;
            else if (stristr(dev->name, "touch"))
                vtDev = &virtualTabletTouch;
            else if (stristr(dev->name, "pad"))
                vtDev = &virtualTabletPad;
            else
                return;
        }

        if (dev->valFirst >= vtDev->numValuators ||
            buttons > vtDev->numButtons)
            return;

        vtDev->valFirst = dev->valFirst;
        vtDev->valCount = min(dev->valCount,
                              vtDev->numValuators - vtDev->valFirst);

        for (i = vtDev->valFirst; i < vtDev->valFirst + vtDev->valCount; i++)
				{
            vtDev->values[i] = (int)roundl(
                (double)(dev->values[i] - dev->valuators[i].rangeMin) /
                    (double)(dev->valuators[i].rangeMax -
                             dev->valuators[i].rangeMin) *
                (double)(vtDev->valuators[i].rangeMax -
                         vtDev->valuators[i].rangeMin) +
                (double)vtDev->valuators[i].rangeMin);
        }
        dev = vtDev;
    }

    if (dev->valCount > 0) {
        valuator_mask_set_range(&mask, 0, dev->numValuators, dev->values);
        QueuePointerEvents(dev->pDev, type, buttons,
                           dev->mode == Absolute ? POINTER_ABSOLUTE :
                           POINTER_RELATIVE, &mask);
    } else {
        valuator_mask_set_range(&mask, 0, 0, NULL);
        QueuePointerEvents(dev->pDev, type, buttons, POINTER_RELATIVE, &mask);
    }
    mieqProcessInputEvents();
}
Esempio n. 8
0
void
xnestCollectEvents(void)
{
    XEvent X;
    int valuators[2];
    ValuatorMask mask;
    ScreenPtr pScreen;

    while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
        switch (X.type) {
        case KeyPress:
            xnestUpdateModifierState(X.xkey.state);
            xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
            break;

        case KeyRelease:
            xnestUpdateModifierState(X.xkey.state);
            xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
            break;

        case ButtonPress:
            valuator_mask_set_range(&mask, 0, 0, NULL);
            xnestUpdateModifierState(X.xkey.state);
            lastEventTime = GetTimeInMillis();
            QueuePointerEvents(xnestPointerDevice, ButtonPress,
                               X.xbutton.button, POINTER_RELATIVE, &mask);
            break;

        case ButtonRelease:
            valuator_mask_set_range(&mask, 0, 0, NULL);
            xnestUpdateModifierState(X.xkey.state);
            lastEventTime = GetTimeInMillis();
            QueuePointerEvents(xnestPointerDevice, ButtonRelease,
                               X.xbutton.button, POINTER_RELATIVE, &mask);
            break;

        case MotionNotify:
            valuators[0] = X.xmotion.x;
            valuators[1] = X.xmotion.y;
            valuator_mask_set_range(&mask, 0, 2, valuators);
            lastEventTime = GetTimeInMillis();
            QueuePointerEvents(xnestPointerDevice, MotionNotify,
                               0, POINTER_ABSOLUTE, &mask);
            break;

        case FocusIn:
            if (X.xfocus.detail != NotifyInferior) {
                pScreen = xnestScreen(X.xfocus.window);
                if (pScreen)
                    xnestDirectInstallColormaps(pScreen);
            }
            break;

        case FocusOut:
            if (X.xfocus.detail != NotifyInferior) {
                pScreen = xnestScreen(X.xfocus.window);
                if (pScreen)
                    xnestDirectUninstallColormaps(pScreen);
            }
            break;

        case KeymapNotify:
            break;

        case EnterNotify:
            if (X.xcrossing.detail != NotifyInferior) {
                pScreen = xnestScreen(X.xcrossing.window);
                if (pScreen) {
                    NewCurrentScreen(inputInfo.pointer, pScreen, X.xcrossing.x,
                                     X.xcrossing.y);
                    valuators[0] = X.xcrossing.x;
                    valuators[1] = X.xcrossing.y;
                    valuator_mask_set_range(&mask, 0, 2, valuators);
                    lastEventTime = GetTimeInMillis();
                    QueuePointerEvents(xnestPointerDevice, MotionNotify,
                                       0, POINTER_ABSOLUTE, &mask);
                    xnestDirectInstallColormaps(pScreen);
                }
            }
            break;

        case LeaveNotify:
            if (X.xcrossing.detail != NotifyInferior) {
                pScreen = xnestScreen(X.xcrossing.window);
                if (pScreen) {
                    xnestDirectUninstallColormaps(pScreen);
                }
            }
            break;

        case DestroyNotify:
            if (xnestParentWindow != (Window) 0 &&
                X.xdestroywindow.window == xnestParentWindow)
                exit(0);
            break;

        case CirculateNotify:
        case ConfigureNotify:
        case GravityNotify:
        case MapNotify:
        case ReparentNotify:
        case UnmapNotify:
            break;

        default:
            ErrorF("xnest warning: unhandled event\n");
            break;
        }
    }
}
Esempio n. 9
0
void
DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button,
                        double pointer_x, double pointer_y,
                        double pointer_dx, double pointer_dy)
{
    static int darwinFakeMouseButtonDown = 0;
    ScreenPtr screen;
    ValuatorMask valuators;

    if (!darwinEvents) {
        DEBUG_LOG("%s called before darwinEvents was initialized\n",
                  __FUNCTION__);
        return;
    }

    screen = miPointerGetScreen(pDev);
    if (!screen) {
        DEBUG_LOG("%s called before screen was initialized\n",
                  __FUNCTION__);
        return;
    }

    /* Handle fake click */
    if (ev_type == ButtonPress && darwinFakeButtons && ev_button == 1) {
        if (darwinFakeMouseButtonDown != 0) {
            /* We're currently "down" with another button, so release it first */
            DarwinSendPointerEvents(pDev, ButtonRelease,
                                    darwinFakeMouseButtonDown,
                                    pointer_x, pointer_y, 0.0, 0.0);
            darwinFakeMouseButtonDown = 0;
        }
        if (darwin_all_modifier_flags & darwinFakeMouse2Mask) {
            ev_button = 2;
            darwinFakeMouseButtonDown = 2;
            DarwinUpdateModKeys(
                darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
        }
        else if (darwin_all_modifier_flags & darwinFakeMouse3Mask) {
            ev_button = 3;
            darwinFakeMouseButtonDown = 3;
            DarwinUpdateModKeys(
                darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
        }
    }

    if (ev_type == ButtonRelease && ev_button == 1) {
        if (darwinFakeMouseButtonDown) {
            ev_button = darwinFakeMouseButtonDown;
        }

        if (darwinFakeMouseButtonDown == 2) {
            DarwinUpdateModKeys(
                darwin_all_modifier_flags & ~darwinFakeMouse2Mask);
        }
        else if (darwinFakeMouseButtonDown == 3) {
            DarwinUpdateModKeys(
                darwin_all_modifier_flags & ~darwinFakeMouse3Mask);
        }

        darwinFakeMouseButtonDown = 0;
    }

    /* Fix offset between darwin and X screens */
    pointer_x -= darwinMainScreenX + screen->x;
    pointer_y -= darwinMainScreenY + screen->y;

    valuator_mask_zero(&valuators);
    valuator_mask_set_double(&valuators, 0, pointer_x);
    valuator_mask_set_double(&valuators, 1, pointer_y);

    if (ev_type == MotionNotify) {
        if (pointer_dx != 0.0)
            valuator_mask_set_double(&valuators, 2, pointer_dx);
        if (pointer_dy != 0.0)
            valuator_mask_set_double(&valuators, 3, pointer_dy);
    }

    darwinEvents_lock();
    {
        QueuePointerEvents(pDev, ev_type, ev_button, POINTER_ABSOLUTE,
                           &valuators);
        DarwinPokeEQ();
    }
    darwinEvents_unlock();
}