using System;
using System.Runtime.InteropServices;
using UnityEngine;
namespace FullscreenEditor.Windows {
[System.Serializable]
[StructLayout(LayoutKind.Sequential)]
internal struct NativeRect {
public int left;
public int top;
public int right;
public int bottom;
public static implicit operator Rect(NativeRect other) {
return Rect.MinMaxRect(
other.left,
other.top,
other.right,
other.bottom
);
}
public static implicit operator NativeRect(Rect other) {
return new NativeRect {
left = (int)other.xMin,
top = (int)other.yMin,
right = (int)other.xMax,
bottom = (int)other.yMax
};
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct MonitorInfoEx {
private const int CCHDEVICENAME = 0x20;
public int size;
public NativeRect monitor;
public NativeRect work;
public uint flags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
public string DeviceName;
public void Init() {
this.size = 40 + 1 * CCHDEVICENAME;
this.DeviceName = string.Empty;
}
}
[System.Serializable]
[StructLayout(LayoutKind.Sequential)]
internal struct DevMode {
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
public short dmSize;
public short dmDriverExtra;
public int dmFields;
public int dmPositionX;
public int dmPositionY;
public ScreenOrientation dmDisplayOrientation;
public int dmDisplayFixedOutput;
public short dmColor;
public short dmDuplex;
public short dmYResolution;
public short dmTTOption;
public short dmCollate;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]
public string dmFormName;
public short dmLogPixels;
public int dmBitsPerPel;
public int dmPelsWidth;
public int dmPelsHeight;
public int dmDisplayFlags;
public int dmDisplayFrequency;
public int dmICMMethod;
public int dmICMIntent;
public int dmMediaType;
public int dmDitherType;
public int dmReserved1;
public int dmReserved2;
public int dmPanningWidth;
public int dmPanningHeight;
}
[Flags]
internal enum DisplayDeviceStateFlags : int {
/// The device is part of the desktop.
AttachedToDesktop = 0x1,
MultiDriver = 0x2,
/// The device is part of the desktop.
PrimaryDevice = 0x4,
/// Represents a pseudo device used to mirror application drawing for remoting or other purposes.
MirroringDriver = 0x8,
/// The device is VGA compatible.
VGACompatible = 0x10,
/// The device is removable; it cannot be the primary display.
Removable = 0x20,
/// The device has more display modes than its output devices support.
ModesPruned = 0x8000000,
Remote = 0x4000000,
Disconnect = 0x2000000
}
[System.Serializable]
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
internal struct DisplayDevice {
[MarshalAs(UnmanagedType.U4)]
public int cb;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string DeviceName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceString;
[MarshalAs(UnmanagedType.U4)]
public DisplayDeviceStateFlags StateFlags;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string DeviceKey;
}
}