2021-06-14 06:42:55 +00:00
|
|
|
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; }
|
2023-07-01 22:25:07 +00:00
|
|
|
|
2021-06-14 06:42:55 +00:00
|
|
|
public Vector2 CurrentPosition { get; private set; }
|
2023-07-01 22:25:07 +00:00
|
|
|
public Vector2 Scroll { get; private set; }
|
2021-06-14 06:42:55 +00:00
|
|
|
|
|
|
|
public GTK3MouseDriver(Widget parent)
|
|
|
|
{
|
|
|
|
_widget = parent;
|
|
|
|
|
2023-07-01 22:25:07 +00:00
|
|
|
_widget.MotionNotifyEvent += Parent_MotionNotifyEvent;
|
|
|
|
_widget.ButtonPressEvent += Parent_ButtonPressEvent;
|
2021-06-14 06:42:55 +00:00
|
|
|
_widget.ButtonReleaseEvent += Parent_ButtonReleaseEvent;
|
2023-07-01 22:25:07 +00:00
|
|
|
_widget.ScrollEvent += Parent_ScrollEvent;
|
2021-06-14 06:42:55 +00:00
|
|
|
|
|
|
|
PressedButtons = new bool[(int)MouseButton.Count];
|
|
|
|
}
|
|
|
|
|
2021-06-24 00:09:08 +00:00
|
|
|
|
|
|
|
[GLib.ConnectBefore]
|
|
|
|
private void Parent_ScrollEvent(object o, ScrollEventArgs args)
|
|
|
|
{
|
|
|
|
Scroll = new Vector2((float)args.Event.X, (float)args.Event.Y);
|
|
|
|
}
|
|
|
|
|
2021-06-14 06:42:55 +00:00
|
|
|
[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)
|
|
|
|
{
|
2023-07-01 22:25:07 +00:00
|
|
|
return PressedButtons[(int)button];
|
2021-06-14 06:42:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public Size GetClientSize()
|
|
|
|
{
|
|
|
|
return new Size(_widget.AllocatedWidth, _widget.AllocatedHeight);
|
|
|
|
}
|
|
|
|
|
|
|
|
public string DriverName => "GTK3";
|
2023-07-01 22:25:07 +00:00
|
|
|
|
2021-06-14 06:42:55 +00:00
|
|
|
public event Action<string> OnGamepadConnected
|
|
|
|
{
|
2023-07-01 22:25:07 +00:00
|
|
|
add { }
|
2021-06-14 06:42:55 +00:00
|
|
|
remove { }
|
|
|
|
}
|
|
|
|
|
|
|
|
public event Action<string> OnGamepadDisconnected
|
|
|
|
{
|
2023-07-01 22:25:07 +00:00
|
|
|
add { }
|
2021-06-14 06:42:55 +00:00
|
|
|
remove { }
|
|
|
|
}
|
|
|
|
|
2023-07-01 22:25:07 +00:00
|
|
|
public ReadOnlySpan<string> GamepadsIds => new[] { "0" };
|
|
|
|
|
2021-06-14 06:42:55 +00:00
|
|
|
public IGamepad GetGamepad(string id)
|
|
|
|
{
|
|
|
|
return new GTK3Mouse(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
{
|
|
|
|
if (_isDisposed)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-07-01 22:25:07 +00:00
|
|
|
GC.SuppressFinalize(this);
|
|
|
|
|
2021-06-14 06:42:55 +00:00
|
|
|
_isDisposed = true;
|
|
|
|
|
|
|
|
_widget.MotionNotifyEvent -= Parent_MotionNotifyEvent;
|
|
|
|
_widget.ButtonPressEvent -= Parent_ButtonPressEvent;
|
|
|
|
_widget.ButtonReleaseEvent -= Parent_ButtonReleaseEvent;
|
|
|
|
|
|
|
|
_widget = null;
|
|
|
|
}
|
|
|
|
}
|
2023-07-01 22:25:07 +00:00
|
|
|
}
|