1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Drawing;
5 using System.Linq;
6 using System.Text;
7 using System.Threading.Tasks;
8 using System.Windows.Forms;
9 
10 namespace Mesen.GUI.Forms
11 {
12 	public class frmFullscreenRenderer : BaseInputForm
13 	{
14 		private const int LeftMouseButtonKeyCode = 0x200;
15 		private const int RightMouseButtonKeyCode = 0x201;
16 		private const int MiddleMouseButtonKeyCode = 0x202;
17 		private bool _closing = false;
18 
frmFullscreenRenderer()19 		public frmFullscreenRenderer()
20 		{
21 			this.BackColor = Color.Black;
22 			this.Text = "Mesen Fullscreen Window";
23 			this.FormBorderStyle = FormBorderStyle.None;
24 			this.WindowState = FormWindowState.Maximized;
25 		}
26 
OnFormClosing(FormClosingEventArgs e)27 		protected override void OnFormClosing(FormClosingEventArgs e)
28 		{
29 			_closing = true;
30 			base.OnFormClosing(e);
31 		}
32 
OnDeactivate(EventArgs e)33 		protected override void OnDeactivate(EventArgs e)
34 		{
35 			base.OnDeactivate(e);
36 
37 			if(!_closing) {
38 				//Close fullscreen mode if window loses focus
39 				this.Close();
40 			}
41 		}
42 
OnMouseDown(MouseEventArgs e)43 		protected override void OnMouseDown(MouseEventArgs e)
44 		{
45 			base.OnMouseDown(e);
46 			CursorManager.CaptureMouse();
47 			SetMouseButtonState(Control.MouseButtons);
48 		}
49 
OnMouseUp(MouseEventArgs e)50 		protected override void OnMouseUp(MouseEventArgs e)
51 		{
52 			base.OnMouseUp(e);
53 			SetMouseButtonState(Control.MouseButtons);
54 		}
55 
SetMouseButtonState(MouseButtons pressedButtons)56 		private void SetMouseButtonState(MouseButtons pressedButtons)
57 		{
58 			InteropEmu.SetKeyState(LeftMouseButtonKeyCode, pressedButtons.HasFlag(MouseButtons.Left));
59 			InteropEmu.SetKeyState(RightMouseButtonKeyCode, pressedButtons.HasFlag(MouseButtons.Right));
60 			InteropEmu.SetKeyState(MiddleMouseButtonKeyCode, pressedButtons.HasFlag(MouseButtons.Middle));
61 		}
62 
OnMouseMove(MouseEventArgs e)63 		protected override void OnMouseMove(MouseEventArgs e)
64 		{
65 			base.OnMouseMove(e);
66 
67 			InteropEmu.ScreenSize size = InteropEmu.GetScreenSize(false);
68 			int leftMargin = (this.Width - size.Width) / 2;
69 			int topMargin = (this.Height - size.Height) / 2;
70 
71 			CursorManager.OnMouseMove(this);
72 
73 			if(CursorManager.NeedMouseIcon) {
74 				this.Cursor = Cursors.Cross;
75 			}
76 
77 			double xPos = (double)(e.X - leftMargin) / size.Width;
78 			double yPos = (double)(e.Y - topMargin) / size.Height;
79 
80 			xPos = Math.Max(0.0, Math.Min(1.0, xPos));
81 			yPos = Math.Max(0.0, Math.Min(1.0, yPos));
82 
83 			InteropEmu.SetMousePosition(xPos, yPos);
84 		}
85 
OnMouseLeave(EventArgs e)86 		protected override void OnMouseLeave(EventArgs e)
87 		{
88 			base.OnMouseLeave(e);
89 
90 			CursorManager.OnMouseLeave();
91 			InteropEmu.SetMousePosition(-1, -1);
92 		}
93 	}
94 }
95