using Gdk; using Gtk; using System; using System.Numerics; using Size = System.Drawing.Size; namespace Ryujinx.Input.GTK3 { public class GTK3MouseDriver : IGamepadDriver { private Widget _widget; private bool _isDisposed; public bool[] PressedButtons { get; } public Vector2 CurrentPosition { get; private set; } public GTK3MouseDriver(Widget parent) { _widget = parent; _widget.MotionNotifyEvent += Parent_MotionNotifyEvent; _widget.ButtonPressEvent += Parent_ButtonPressEvent; _widget.ButtonReleaseEvent += Parent_ButtonReleaseEvent; PressedButtons = new bool[(int)MouseButton.Count]; } [GLib.ConnectBefore] private void Parent_ButtonReleaseEvent(object o, ButtonReleaseEventArgs args) { PressedButtons[args.Event.Button - 1] = false; } [GLib.ConnectBefore] private void Parent_ButtonPressEvent(object o, ButtonPressEventArgs args) { PressedButtons[args.Event.Button - 1] = true; } [GLib.ConnectBefore] private void Parent_MotionNotifyEvent(object o, MotionNotifyEventArgs args) { if (args.Event.Device.InputSource == InputSource.Mouse) { CurrentPosition = new Vector2((float)args.Event.X, (float)args.Event.Y); } } public bool IsButtonPressed(MouseButton button) { return PressedButtons[(int) button]; } public Size GetClientSize() { return new Size(_widget.AllocatedWidth, _widget.AllocatedHeight); } public string DriverName => "GTK3"; public event Action OnGamepadConnected { add { } remove { } } public event Action OnGamepadDisconnected { add { } remove { } } public ReadOnlySpan GamepadsIds => new[] {"0"}; public IGamepad GetGamepad(string id) { return new GTK3Mouse(this); } public void Dispose() { if (_isDisposed) { return; } _isDisposed = true; _widget.MotionNotifyEvent -= Parent_MotionNotifyEvent; _widget.ButtonPressEvent -= Parent_ButtonPressEvent; _widget.ButtonReleaseEvent -= Parent_ButtonReleaseEvent; _widget = null; } } }