Exemplo n.º 1
0
    void Update()
    {
        foreach (var downKeys in downKeysByDeviceId)
        {
            downKeys.Value.Clear();
        }
        foreach (var upKeys in upKeysByDeviceId)
        {
            upKeys.Value.Clear();
        }

        // Poll the events and properly update whatever we need
        IntPtr data      = poll();
        int    numEvents = Marshal.ReadInt32(data);

        for (int i = 0; i < numEvents; ++i)
        {
            var  ev     = new RawInputEvent();
            long offset = data.ToInt64() + sizeof(int) + i * Marshal.SizeOf(ev);
            ev.devHandle        = Marshal.ReadInt32(new IntPtr(offset + 0));
            ev.x                = Marshal.ReadInt32(new IntPtr(offset + 4));
            ev.y                = Marshal.ReadInt32(new IntPtr(offset + 8));
            ev.wheel            = Marshal.ReadInt32(new IntPtr(offset + 12));
            ev.press            = Marshal.ReadByte(new IntPtr(offset + 16));
            ev.release          = Marshal.ReadByte(new IntPtr(offset + 17));
            ev.type             = Marshal.ReadByte(new IntPtr(offset + 18));
            ev.padding0         = Marshal.ReadByte(new IntPtr(offset + 19));
            ev.keyboardFlags    = (ushort)Marshal.ReadInt16(new IntPtr(offset + 20));
            ev.keyboardVkey     = (ushort)Marshal.ReadInt16(new IntPtr(offset + 22));
            ev.keyboardMakeCode = (ushort)Marshal.ReadInt16(new IntPtr(offset + 24));

            if (ev.type == RE_DEVICE_CONNECT)
            {
                if (verbose)
                {
                    Debug.LogFormat("Device connected: handle {0}", ev.devHandle);
                }
                SendMessageUpwards("OnInputDeviceConnect", ev.devHandle, SendMessageOptions.DontRequireReceiver);
            }
            else if (ev.type == RE_DEVICE_DISCONNECT)
            {
                if (verbose)
                {
                    Debug.LogFormat("Device disconnected: handle {0}", ev.devHandle);
                }
                SendMessageUpwards("OnInputDeviceDisconnect", ev.devHandle, SendMessageOptions.DontRequireReceiver);
            }
            else if (ev.type == RE_KEYBOARD)
            {
                var isBreakBitSet = ((ev.keyboardFlags & Win32.RI_KEY_BREAK) != 0);
                var isE0BitSet    = ((ev.keyboardFlags & Win32.RI_KEY_E0) != 0);

                var keyName = KeyMapper.GetKeyName(Win32.VirtualKeyCorrection(ev.keyboardVkey, isE0BitSet, ev.keyboardMakeCode)).ToUpper();

                if (verbose)
                {
                    Debug.LogFormat("{0} H:{1} Key:{2} Break:{3} Flags:{4} Vkey:{5}",
                                    getEventName(ev.type),
                                    ev.devHandle,
                                    keyName,
                                    isBreakBitSet,
                                    ev.keyboardFlags,
                                    ev.keyboardVkey);
                }

                // Pressed keys
                if (!keysByDeviceId.ContainsKey(ev.devHandle))
                {
                    keysByDeviceId[ev.devHandle] = new Dictionary <string, bool>();
                }
                var oldPressed = GetKey(ev.devHandle, keyName);
                var newPressed = (isBreakBitSet == false);
                keysByDeviceId[ev.devHandle][keyName] = newPressed;

                // Down keys
                if (!downKeysByDeviceId.ContainsKey(ev.devHandle))
                {
                    downKeysByDeviceId[ev.devHandle] = new Dictionary <string, bool>();
                }
                if (oldPressed == false && newPressed == true)
                {
                    downKeysByDeviceId[ev.devHandle][keyName] = true;
                }

                // Up keys
                if (!upKeysByDeviceId.ContainsKey(ev.devHandle))
                {
                    upKeysByDeviceId[ev.devHandle] = new Dictionary <string, bool>();
                }
                if (oldPressed == true && newPressed == false)
                {
                    upKeysByDeviceId[ev.devHandle][keyName] = true;
                }
            }
        }
        Marshal.FreeCoTaskMem(data);

        if (verbose)
        {
            foreach (var pk in downKeysByDeviceId)
            {
                foreach (var k in pk.Value)
                {
                    if (k.Value)
                    {
                        Debug.LogFormat("Dev Handle: {0} Key Down: {1}", pk.Key, k.Key);
                    }
                }
            }

            foreach (var pk in upKeysByDeviceId)
            {
                foreach (var k in pk.Value)
                {
                    if (k.Value)
                    {
                        Debug.LogFormat("Dev Handle: {0} Key Up: {1}", pk.Key, k.Key);
                    }
                }
            }
        }
    }
Exemplo n.º 2
0
    void Update()
    {
        IntPtr data      = poll();
        int    numEvents = Marshal.ReadInt32(data);

        if (numEvents > 0)
        {
            lastEvents = numEvents;
        }
        for (int i = 0; i < numEvents; ++i)
        {
            var  ev     = new RawInputEvent();
            long offset = data.ToInt64() + sizeof(int) + i * Marshal.SizeOf(ev);
            ev.devHandle = Marshal.ReadInt32(new IntPtr(offset + 0));
            ev.x         = Marshal.ReadInt32(new IntPtr(offset + 4));
            ev.y         = Marshal.ReadInt32(new IntPtr(offset + 8));
            ev.wheel     = Marshal.ReadInt32(new IntPtr(offset + 12));
            ev.press     = Marshal.ReadByte(new IntPtr(offset + 16));
            ev.release   = Marshal.ReadByte(new IntPtr(offset + 17));
            ev.type      = Marshal.ReadByte(new IntPtr(offset + 18));

            if (ev.type == RE_DEVICE_CONNECT)
            {
                addCursor(ev.devHandle);
            }
            else if (ev.type == RE_DEVICE_DISCONNECT)
            {
                deleteCursor(ev.devHandle);
            }
            else if (ev.type == RE_MOUSE)
            {
                MousePointer pointer = null;
                if (pointersByDeviceId.TryGetValue(ev.devHandle, out pointer))
                {
                    float dx = ev.x * pointer.sensitivity;
                    float dy = ev.y * pointer.sensitivity;
                    pointer.delta = new Vector2(dx, dy);

                    //Invisible while not moving

                    pointer.obj.transform.position += new Vector3(dx, -dy, 0);

                    if (Mathf.Abs(dx) > accelerationThreshold)
                    {
                        dx *= accelerationMultiplier;
                    }
                    if (Mathf.Abs(dy) > accelerationThreshold)
                    {
                        dy *= accelerationMultiplier;
                    }

                    RectTransform rect = pointer.obj.transform.parent.GetComponent <RectTransform>();
                    pointer.obj.transform.position = new Vector3(
                        Mathf.Clamp(pointer.obj.transform.position.x, 0, rect.rect.width - screenBorderPixels),
                        Mathf.Clamp(pointer.obj.transform.position.y, 0, rect.rect.height - screenBorderPixels),
                        pointer.obj.transform.position.z);

                    if ((int)ev.press != 0)
                    {
                        Interaction(pointer, (MouseButton)ev.press, ActionType.PRESSED);
                    }

                    if ((int)ev.release != 0)
                    {
                        Interaction(pointer, (MouseButton)ev.release, ActionType.RELEASED);
                    }

                    if (dx != 0 || dy != 0)
                    {
                        Interaction(pointer, MouseButton.NONE, ActionType.MOVEMENT);
                    }
                }
                else
                {
                    Debug.Log("Unknown device found");
                    addCursor(ev.devHandle);
                }
            }
        }
        Marshal.FreeCoTaskMem(data);
    }