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 void SetWindowFocus(ImGuiViewportPtr vp) { if (p_sdl_RaiseWindow == null) { p_sdl_RaiseWindow = Sdl2Native.LoadFunction <SDL_RaiseWindow_t>("SDL_RaiseWindow"); } VeldridImGuiWindow window = (VeldridImGuiWindow)GCHandle.FromIntPtr(vp.PlatformUserData).Target; p_sdl_RaiseWindow(window.Window.SdlWindowHandle); }
private void UpdateImGuiInput(InputSnapshot snapshot) { ImGuiIOPtr io = ImGui.GetIO(); Vector2 mousePosition = snapshot.MousePosition; // Determine if any of the mouse buttons were pressed during this snapshot period, even if they are no longer held. bool leftPressed = false; bool middlePressed = false; bool rightPressed = false; foreach (MouseEvent me in snapshot.MouseEvents) { if (me.Down) { switch (me.MouseButton) { case MouseButton.Left: leftPressed = true; break; case MouseButton.Middle: middlePressed = true; break; case MouseButton.Right: rightPressed = true; break; } } } io.MouseDown[0] = leftPressed || snapshot.IsMouseDown(MouseButton.Left); io.MouseDown[1] = middlePressed || snapshot.IsMouseDown(MouseButton.Right); io.MouseDown[2] = rightPressed || snapshot.IsMouseDown(MouseButton.Middle); if (p_sdl_GetGlobalMouseState == null) { p_sdl_GetGlobalMouseState = Sdl2Native.LoadFunction <SDL_GetGlobalMouseState_t>("SDL_GetGlobalMouseState"); } int x, y; unsafe { uint buttons = p_sdl_GetGlobalMouseState(&x, &y); io.MouseDown[0] = (buttons & 0b0001) != 0; io.MouseDown[1] = (buttons & 0b0010) != 0; io.MouseDown[2] = (buttons & 0b0100) != 0; } io.MousePos = new Vector2(x, y); io.MouseWheel = snapshot.WheelDelta; IReadOnlyList <char> keyCharPresses = snapshot.KeyCharPresses; for (int i = 0; i < keyCharPresses.Count; i++) { char c = keyCharPresses[i]; io.AddInputCharacter(c); } IReadOnlyList <KeyEvent> keyEvents = snapshot.KeyEvents; for (int i = 0; i < keyEvents.Count; i++) { KeyEvent keyEvent = keyEvents[i]; io.KeysDown[(int)keyEvent.Key] = keyEvent.Down; if (keyEvent.Key == Key.ControlLeft) { _controlDown = keyEvent.Down; } if (keyEvent.Key == Key.ShiftLeft) { _shiftDown = keyEvent.Down; } if (keyEvent.Key == Key.AltLeft) { _altDown = keyEvent.Down; } if (keyEvent.Key == Key.WinLeft) { _winKeyDown = keyEvent.Down; } } io.KeyCtrl = _controlDown; io.KeyAlt = _altDown; io.KeyShift = _shiftDown; io.KeySuper = _winKeyDown; ImVector <ImGuiViewportPtr> viewports = ImGui.GetPlatformIO().Viewports; for (int i = 1; i < viewports.Size; i++) { ImGuiViewportPtr v = viewports[i]; VeldridImGuiWindow window = ((VeldridImGuiWindow)GCHandle.FromIntPtr(v.PlatformUserData).Target); window.Update(); } }
private void UpdateImGuiInput() { ImGuiIOPtr io = ImGui.GetIO(); io.MouseWheel = 0; ImVector <ImGuiViewportPtr> viewports = ImGui.GetPlatformIO().Viewports; for (int i = 0; i < viewports.Size; i++) { ImGuiViewportPtr v = viewports[i]; var target = GCHandle.FromIntPtr(v.PlatformUserData).Target; if (target is VeldridImGuiWindow veldridWindow) { var snapshot = veldridWindow.PumpEvents(); io.MouseWheel += snapshot.WheelDelta; IReadOnlyList <char> keyCharPresses = snapshot.KeyCharPresses; for (int k = 0; k < keyCharPresses.Count; k++) { char c = keyCharPresses[k]; io.AddInputCharacter(c); } IReadOnlyList <KeyEvent> keyEvents = snapshot.KeyEvents; for (int k = 0; k < keyEvents.Count; k++) { KeyEvent keyEvent = keyEvents[k]; io.KeysDown[(int)keyEvent.Key] = keyEvent.Down; if (keyEvent.Key == Key.ControlLeft) { _controlDown = keyEvent.Down; } if (keyEvent.Key == Key.ShiftLeft) { _shiftDown = keyEvent.Down; } if (keyEvent.Key == Key.AltLeft) { _altDown = keyEvent.Down; } if (keyEvent.Key == Key.WinLeft) { _winKeyDown = keyEvent.Down; } } } } if (p_sdl_GetGlobalMouseState == null) { p_sdl_GetGlobalMouseState = Sdl2Native.LoadFunction <SDL_GetGlobalMouseState_t>("SDL_GetGlobalMouseState"); } int x, y; unsafe { uint buttons = p_sdl_GetGlobalMouseState(&x, &y); io.MouseDown[0] = (buttons & 0b0001) != 0; io.MouseDown[1] = (buttons & 0b0010) != 0; io.MouseDown[2] = (buttons & 0b0100) != 0; } io.MousePos = new Vector2(x, y); io.KeyCtrl = _controlDown; io.KeyAlt = _altDown; io.KeyShift = _shiftDown; io.KeySuper = _winKeyDown; }