private void SetButtonState(MouseButton button, bool pressed) { if (pressed) { state.EnableBit((int)button); } else { state.DisableBit((int)button); } }
void WriteBit(MouseButton offset, int enabled) { if (enabled != 0) { mouse.EnableBit((int)offset); } else { mouse.DisableBit((int)offset); } }
void ProcessEvents() { while (true) { XEvent e = new XEvent(); XGenericEventCookie cookie; using (new XLock(window.Display)) { if (!Functions.XCheckIfEvent(window.Display, ref e, Predicate, new IntPtr(XIOpCode))) { return; } cookie = e.GenericEventCookie; if (Functions.XGetEventData(window.Display, ref cookie) != 0) { XIRawEvent raw = (XIRawEvent) Marshal.PtrToStructure(cookie.data, typeof(XIRawEvent)); if (!rawids.ContainsKey(raw.deviceid)) { mice.Add(new MouseState()); rawids.Add(raw.deviceid, mice.Count - 1); } MouseState state = mice[rawids[raw.deviceid]]; switch (raw.evtype) { case XIEventType.RawMotion: double x = 0, y = 0; if (IsBitSet(raw.valuators.mask, 0)) { x = BitConverter.Int64BitsToDouble(Marshal.ReadInt64(raw.raw_values, 0)); } if (IsBitSet(raw.valuators.mask, 1)) { y = BitConverter.Int64BitsToDouble(Marshal.ReadInt64(raw.raw_values, 8)); } if (!CheckMouseWarp(x, y)) { state.X += (int)x; state.Y += (int)y; } break; case XIEventType.RawButtonPress: switch (raw.detail) { case 1: state.EnableBit((int)MouseButton.Left); break; case 2: state.EnableBit((int)MouseButton.Middle); break; case 3: state.EnableBit((int)MouseButton.Right); break; case 4: state.WheelPrecise++; break; case 5: state.WheelPrecise--; break; case 6: state.EnableBit((int)MouseButton.Button1); break; case 7: state.EnableBit((int)MouseButton.Button2); break; case 8: state.EnableBit((int)MouseButton.Button3); break; case 9: state.EnableBit((int)MouseButton.Button4); break; case 10: state.EnableBit((int)MouseButton.Button5); break; case 11: state.EnableBit((int)MouseButton.Button6); break; case 12: state.EnableBit((int)MouseButton.Button7); break; case 13: state.EnableBit((int)MouseButton.Button8); break; case 14: state.EnableBit((int)MouseButton.Button9); break; } break; case XIEventType.RawButtonRelease: switch (raw.detail) { case 1: state.DisableBit((int)MouseButton.Left); break; case 2: state.DisableBit((int)MouseButton.Middle); break; case 3: state.DisableBit((int)MouseButton.Right); break; case 6: state.DisableBit((int)MouseButton.Button1); break; case 7: state.DisableBit((int)MouseButton.Button2); break; case 8: state.DisableBit((int)MouseButton.Button3); break; case 9: state.DisableBit((int)MouseButton.Button4); break; case 10: state.DisableBit((int)MouseButton.Button5); break; case 11: state.DisableBit((int)MouseButton.Button6); break; case 12: state.DisableBit((int)MouseButton.Button7); break; case 13: state.DisableBit((int)MouseButton.Button8); break; case 14: state.DisableBit((int)MouseButton.Button9); break; } break; } mice[rawids[raw.deviceid]] = state; } Functions.XFreeEventData(window.Display, ref cookie); } } }
private void ProcessEvents() { while (true) { XEvent e = new XEvent(); using (new XLock(this.window.Display)) { if (!Functions.XCheckIfEvent(this.window.Display, ref e, this.Predicate, new IntPtr(XI2Mouse.XIOpCode))) { break; } XGenericEventCookie cookie = e.GenericEventCookie; if (Functions.XGetEventData(this.window.Display, ref cookie) != 0) { XIRawEvent xiRawEvent = (XIRawEvent)Marshal.PtrToStructure(cookie.data, typeof(XIRawEvent)); if (!this.rawids.ContainsKey(xiRawEvent.deviceid)) { this.mice.Add(new MouseState()); this.rawids.Add(xiRawEvent.deviceid, this.mice.Count - 1); } MouseState mouseState = this.mice[this.rawids[xiRawEvent.deviceid]]; switch (xiRawEvent.evtype) { case XIEventType.RawButtonPress: switch (xiRawEvent.detail) { case 1: mouseState.EnableBit(0); break; case 2: mouseState.EnableBit(1); break; case 3: mouseState.EnableBit(2); break; case 4: ++mouseState.WheelPrecise; break; case 5: --mouseState.WheelPrecise; break; case 6: mouseState.EnableBit(3); break; case 7: mouseState.EnableBit(4); break; case 8: mouseState.EnableBit(5); break; case 9: mouseState.EnableBit(6); break; case 10: mouseState.EnableBit(7); break; case 11: mouseState.EnableBit(8); break; case 12: mouseState.EnableBit(9); break; case 13: mouseState.EnableBit(10); break; case 14: mouseState.EnableBit(11); break; } case XIEventType.RawButtonRelease: switch (xiRawEvent.detail) { case 1: mouseState.DisableBit(0); break; case 2: mouseState.DisableBit(1); break; case 3: mouseState.DisableBit(2); break; case 6: mouseState.DisableBit(3); break; case 7: mouseState.DisableBit(4); break; case 8: mouseState.DisableBit(5); break; case 9: mouseState.DisableBit(6); break; case 10: mouseState.DisableBit(7); break; case 11: mouseState.DisableBit(8); break; case 12: mouseState.DisableBit(9); break; case 13: mouseState.DisableBit(10); break; case 14: mouseState.DisableBit(11); break; } case XIEventType.RawMotion: double x = 0.0; double y = 0.0; if (XI2Mouse.IsBitSet(xiRawEvent.valuators.mask, 0)) { x = BitConverter.Int64BitsToDouble(Marshal.ReadInt64(xiRawEvent.raw_values, 0)); } if (XI2Mouse.IsBitSet(xiRawEvent.valuators.mask, 1)) { y = BitConverter.Int64BitsToDouble(Marshal.ReadInt64(xiRawEvent.raw_values, 8)); } if (!this.CheckMouseWarp(x, y)) { mouseState.X += (int)x; mouseState.Y += (int)y; break; } else { break; } } this.mice[this.rawids[xiRawEvent.deviceid]] = mouseState; } Functions.XFreeEventData(this.window.Display, ref cookie); } } }
public bool ProcessMouseEvent(RawInput rin) { RawMouse rawMouse = rin.Data.Mouse; ContextHandle key = new ContextHandle(rin.Header.Device); if (!this.rawids.ContainsKey(key)) { this.RefreshDevices(); } if (this.mice.Count == 0) { return(false); } int index = this.rawids.ContainsKey(key) ? this.rawids[key] : 0; MouseState mouseState = this.mice[index]; if ((rawMouse.ButtonFlags & RawInputMouseState.LEFT_BUTTON_DOWN) != (RawInputMouseState)0) { mouseState.EnableBit(0); } if ((rawMouse.ButtonFlags & RawInputMouseState.LEFT_BUTTON_UP) != (RawInputMouseState)0) { mouseState.DisableBit(0); } if ((rawMouse.ButtonFlags & RawInputMouseState.RIGHT_BUTTON_DOWN) != (RawInputMouseState)0) { mouseState.EnableBit(2); } if ((rawMouse.ButtonFlags & RawInputMouseState.RIGHT_BUTTON_UP) != (RawInputMouseState)0) { mouseState.DisableBit(2); } if ((rawMouse.ButtonFlags & RawInputMouseState.MIDDLE_BUTTON_DOWN) != (RawInputMouseState)0) { mouseState.EnableBit(1); } if ((rawMouse.ButtonFlags & RawInputMouseState.MIDDLE_BUTTON_UP) != (RawInputMouseState)0) { mouseState.DisableBit(1); } if ((rawMouse.ButtonFlags & RawInputMouseState.BUTTON_4_DOWN) != (RawInputMouseState)0) { mouseState.EnableBit(3); } if ((rawMouse.ButtonFlags & RawInputMouseState.BUTTON_4_UP) != (RawInputMouseState)0) { mouseState.DisableBit(3); } if ((rawMouse.ButtonFlags & RawInputMouseState.BUTTON_5_DOWN) != (RawInputMouseState)0) { mouseState.EnableBit(4); } if ((rawMouse.ButtonFlags & RawInputMouseState.BUTTON_5_UP) != (RawInputMouseState)0) { mouseState.DisableBit(4); } if ((rawMouse.ButtonFlags & RawInputMouseState.WHEEL) != (RawInputMouseState)0) { mouseState.WheelPrecise += (float)(short)rawMouse.ButtonData / 120f; } if ((rawMouse.Flags & RawMouseFlags.MOUSE_MOVE_ABSOLUTE) != RawMouseFlags.MOUSE_MOVE_RELATIVE) { mouseState.X = rawMouse.LastX; mouseState.Y = rawMouse.LastY; } else { mouseState.X += rawMouse.LastX; mouseState.Y += rawMouse.LastY; } lock (this.UpdateLock) { this.mice[index] = mouseState; return(true); } }