private unsafe void UpdateMonitors() { if (p_sdl_GetNumVideoDisplays == null) { p_sdl_GetNumVideoDisplays = Sdl2Native.LoadFunction <SDL_GetNumVideoDisplays_t>("SDL_GetNumVideoDisplays"); } if (p_sdl_GetDisplayUsableBounds_t == null) { p_sdl_GetDisplayUsableBounds_t = Sdl2Native.LoadFunction <SDL_GetDisplayUsableBounds_t>("SDL_GetDisplayUsableBounds"); } ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO(); Marshal.FreeHGlobal(platformIO.NativePtr->Monitors.Data); int numMonitors = p_sdl_GetNumVideoDisplays(); IntPtr data = Marshal.AllocHGlobal(Unsafe.SizeOf <ImGuiPlatformMonitor>() * numMonitors); platformIO.NativePtr->Monitors = new ImVector(numMonitors, numMonitors, data); for (int i = 0; i < numMonitors; i++) { Rectangle r; p_sdl_GetDisplayUsableBounds_t(i, &r); ImGuiPlatformMonitorPtr monitor = platformIO.Monitors[i]; monitor.DpiScale = 1f; monitor.MainPos = new Vector2(r.X, r.Y); monitor.MainSize = new Vector2(r.Width, r.Height); monitor.WorkPos = new Vector2(r.X, r.Y); monitor.WorkSize = new Vector2(r.Width, r.Height); } }
private static void SetUpMonitorData() { ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO(); var platformMonitors = new List <ImGuiPlatformMonitor>(); { Monitor *[] monitors = GLFW.GetMonitors(); for (int i = 0; i < monitors.Length; i++) { Monitor * monitor = monitors[i]; ImGuiPlatformMonitor m = new ImGuiPlatformMonitor(); var vidMode = GLFW.GetVideoMode(monitor); GLFW.GetMonitorPos(monitor, out int x, out int y); m.MainPos = m.WorkPos = new Vector2(x, y); m.MainSize = m.WorkSize = new Vector2(vidMode->Width, vidMode->Height); GLFW.GetMonitorContentScale(monitor, out float xScale, out float yScale); m.DpiScale = xScale; platformMonitors.Add(m); } } _monitorData = platformMonitors.ToArray(); _monitorDataPin = GCHandle.Alloc(_monitorData, GCHandleType.Pinned); var platformMonitorsPtrs = new ImGuiPlatformMonitorPtr[_monitorData.Length]; for (int i = 0; i < _monitorData.Length; i++) { fixed(ImGuiPlatformMonitor *ptr = &_monitorData[i]) { platformMonitorsPtrs[i] = new ImGuiPlatformMonitorPtr(ptr); } } _monitorPtrData = platformMonitorsPtrs; _monitorPtrDataPin = GCHandle.Alloc(_monitorPtrData, GCHandleType.Pinned); _monitorsPtrVector = new ImVector <ImGuiPlatformMonitor>(_monitorPtrData.Length, _monitorPtrData.Length, _monitorDataPin.AddrOfPinnedObject()); { ImGuiPlatformIO *ptr = platformIO; ImVector v = Unsafe.As <ImVector <ImGuiPlatformMonitor>, ImVector>(ref _monitorsPtrVector); ptr->Monitors = v; } }
private unsafe static void UpdateMonitors() { #if DEBUG using Profiler fullProfiler = new Profiler(typeof(ImGuiController)); #endif ImGuiPlatformIOPtr plIo = ImGui.GetPlatformIO(); Marshal.FreeHGlobal(plIo.NativePtr->Monitors.Data); int numMonitors = Sdl_GetNumVideoDisplays(); IntPtr data = Marshal.AllocHGlobal(Unsafe.SizeOf <ImGuiPlatformMonitor>() * numMonitors); plIo.NativePtr->Monitors = new ImVector(numMonitors, numMonitors, data); for (int i = 0; i < numMonitors; i++) { Rectangle r; Sdl_GetDisplayUsableBounds(i, &r); ImGuiPlatformMonitorPtr monitor = plIo.Monitors[i]; monitor.DpiScale = 1f; monitor.MainPos = new Vector2(r.X, r.Y); monitor.MainSize = new Vector2(r.Width, r.Height); monitor.WorkPos = new Vector2(r.X, r.Y); monitor.WorkSize = new Vector2(r.Width, r.Height); } }