using System;
using System.Drawing;
// The 'windowHandle' parameter will contain the window handle for the:
// - Active window when run by hotkey
// - Window Location target when run by a Window Location rule
// - TitleBar Button owner when run by a TitleBar Button
// - Jump List owner when run from a Taskbar Jump List
// - Currently focused window if none of these match
public static class DisplayFusionFunction
{
public static void Run(IntPtr windowHandle)
{
//check to see if there was an error, if there was, exit function
if (windowHandle == IntPtr.Zero)
return;
//get the position of the window in the monitor, and the current monitor
Rectangle windowRect = BFS.Window.GetBounds(windowHandle);
Rectangle currentMonitorRect = BFS.Monitor.GetMonitorBoundsByWindow(windowHandle);
decimal winTransparency = BFS.Window.GetTransparency(windowHandle);
// if the window is not already in halfscreen, move to the left half.
// is window already in left halfscreen mode?
if ( ( windowRect.Width == currentMonitorRect.Width / 2 ) && ( windowRect.X == currentMonitorRect.X ) )
{
//if we got this far then the window is in left halfscreen mode
//move the window to the right side of the previous monitor
BFS.Window.SetTransparency(windowHandle, 0);
BFS.Window.MoveToPreviousMonitor(windowHandle);
BFS.Window.MoveToRightMonitorHalf(windowHandle);
BFS.Window.SetTransparency(windowHandle, winTransparency);
return;
}
// so it's not in left halfscreen mode. is it in right halfscreen?
if ( ( windowRect.Width == currentMonitorRect.Width / 2 ) && ( windowRect.X == currentMonitorRect.X + ( currentMonitorRect.Width / 2 ) ) )
{
//right halfscreen. we want this one to restore to user size, based on the earlier details.
// does this window match the last one recorded?
if ( BFS.Window.GetText(windowHandle) == BFS.ScriptSettings.ReadValue("EmuWinLRWindowName") )
{
//okay, the info is for this window. let's get the values out and resize/move the window.
int NewXPos = Convert.ToInt32(BFS.ScriptSettings.ReadValue("EmuWinLRXPos"));
int NewYPos = Convert.ToInt32(BFS.ScriptSettings.ReadValue("EmuWinLRYPos"));
int NewWidth = Convert.ToInt32(BFS.ScriptSettings.ReadValue("EmuWinLRWidth"));
int NewHeight = Convert.ToInt32(BFS.ScriptSettings.ReadValue("EmuWinLRHeight"));
// Got the values, but they're for monitor 1. No matter, we'll get the offset, then add it back in.
NewXPos = NewXPos + currentMonitorRect.X;
BFS.Window.SetSizeAndLocation(windowHandle, NewXPos, NewYPos, NewWidth, NewHeight);
return;
}
// nope, the info isn't for this window. move on to sending it to left halfscreen.
BFS.Window.MoveToLeftMonitorHalf(windowHandle);
return;
}
// Not left halfscreen, not right halfscreen. Save the details, and then send it to left halfscreen.
// We need the info to be monitor-agnostic, so the XPos value needs to be no more than the width of the screen. How do we do that? By mod division by the width of the screen.
int CalculatedXPos = windowRect.X % currentMonitorRect.Width;
BFS.ScriptSettings.WriteValue("EmuWinLRWindowName", BFS.Window.GetText(windowHandle));
BFS.ScriptSettings.WriteValue("EmuWinLRXPos", Convert.ToString(CalculatedXPos));
BFS.ScriptSettings.WriteValue("EmuWinLRYPos", Convert.ToString(windowRect.Y));
BFS.ScriptSettings.WriteValue("EmuWinLRWidth", Convert.ToString(windowRect.Width));
BFS.ScriptSettings.WriteValue("EmuWinLRHeight", Convert.ToString(windowRect.Height));
BFS.Window.MoveToLeftMonitorHalf(windowHandle);
}
}