luaimplementation: input.getmouse(): button fields are now bools. position fields are now in emulated screen coordinates. no, it doesn't quite work right for some cases of window sizing... so don't do that!

This commit is contained in:
goyuken 2012-12-20 21:40:03 +00:00
parent 79f5a344e1
commit e8a54aaeed
2 changed files with 37 additions and 9 deletions

View File

@ -2530,13 +2530,14 @@ namespace BizHawk.MultiClient
public LuaTable input_getmouse()
{
LuaTable buttons = lua.NewTable();
buttons["X"] = Control.MousePosition.X;
buttons["Y"] = Control.MousePosition.Y;
buttons[MouseButtons.Left.ToString()] = Control.MouseButtons & MouseButtons.Left;
buttons[MouseButtons.Middle.ToString()] = Control.MouseButtons & MouseButtons.Middle;
buttons[MouseButtons.Right.ToString()] = Control.MouseButtons & MouseButtons.Right;
buttons[MouseButtons.XButton1.ToString()] = Control.MouseButtons & MouseButtons.XButton1;
buttons[MouseButtons.XButton2.ToString()] = Control.MouseButtons & MouseButtons.XButton2;
Point p = Global.RenderPanel.ScreenToScreen(Control.MousePosition);
buttons["X"] = p.X;
buttons["Y"] = p.Y;
buttons[MouseButtons.Left.ToString()] = (Control.MouseButtons & MouseButtons.Left) != 0;
buttons[MouseButtons.Middle.ToString()] = (Control.MouseButtons & MouseButtons.Middle) != 0;
buttons[MouseButtons.Right.ToString()] = (Control.MouseButtons & MouseButtons.Right) != 0;
buttons[MouseButtons.XButton1.ToString()] = (Control.MouseButtons & MouseButtons.XButton1) != 0;
buttons[MouseButtons.XButton2.ToString()] = (Control.MouseButtons & MouseButtons.XButton2) != 0;
return buttons;
}

View File

@ -133,6 +133,12 @@ namespace BizHawk.MultiClient
void Present();
bool Resized { get; set; }
Size NativeSize { get; }
/// <summary>
/// convert coordinates
/// </summary>
/// <param name="p">desktop coordinates</param>
/// <returns>ivideoprovider coordinates</returns>
Point ScreenToScreen(Point p);
}
public class SysdrawingRenderPanel : IRenderer, IBlitter
@ -148,7 +154,7 @@ namespace BizHawk.MultiClient
{
backingControl.ReleaseCallback = RetainedViewportPanelDisposeCallback;
lock(this)
lock (this)
tempBuffer = surfaceSet.AllocateSurface(backingControl.Width, backingControl.Height, false);
RenderInternal(surface, false);
@ -176,7 +182,7 @@ namespace BizHawk.MultiClient
void IBlitter.Open()
{
g = Graphics.FromImage(tempBuffer.PeekBitmap());
ClipBounds = new Rectangle(0, 0, NativeSize.Width, NativeSize.Height);
ClipBounds = new Rectangle(0, 0, NativeSize.Width, NativeSize.Height);
}
void IBlitter.Close()
@ -227,6 +233,10 @@ namespace BizHawk.MultiClient
else
g.DrawImage(surface.PeekBitmap(), 0, 0, backingControl.Width, backingControl.Height);
}
if (!transparent)
{
lastsize = new Size(surface.Width, surface.Height);
}
}
public void FastRenderAndPresent(DisplaySurface surface)
@ -252,6 +262,15 @@ namespace BizHawk.MultiClient
AlertFont = new sysdrawingfont("Courier", 14, FontStyle.Bold, GraphicsUnit.Pixel);
}
RetainedViewportPanel backingControl;
Size lastsize = new Size(256, 192);
public Point ScreenToScreen(Point p)
{
p = backingControl.PointToClient(p);
Point ret = new Point(p.X * lastsize.Width / backingControl.Width,
p.Y * lastsize.Height / backingControl.Height);
return ret;
}
}
public interface IBlitter
@ -561,6 +580,14 @@ namespace BizHawk.MultiClient
}
}
public Point ScreenToScreen(Point p)
{
p = backingControl.PointToClient(p);
Point ret = new Point(p.X * Texture.ImageWidth / backingControl.Width,
p.Y * Texture.ImageHeight / backingControl.Height);
return ret;
}
}
#endif