mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Examples: SDL: SDL_GetMouseState() seems problematic, movements feels laggy in the non-viewport code path. (#1542, #2117)
This commit is contained in:
		| @@ -253,39 +253,39 @@ static void ImGui_ImplSDL2_UpdateMousePosAndButtons() | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
| #endif | ||||
|  | ||||
|     int mx, my; | ||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); | ||||
|     int mouse_x, mouse_y; | ||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mouse_x, &mouse_y); // NB: We don't use the x/y results from SDL_GetMouseState() | ||||
|     SDL_GetGlobalMouseState(&mouse_x, &mouse_y); | ||||
|     io.MouseDown[0] = g_MousePressed[0] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_LEFT)) != 0;  // If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame. | ||||
|     io.MouseDown[1] = g_MousePressed[1] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) != 0; | ||||
|     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; | ||||
|     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; | ||||
|  | ||||
| #if SDL_HAS_CAPTURE_MOUSE && !defined(__EMSCRIPTEN__) | ||||
|     SDL_Window* focused_window = SDL_GetKeyboardFocus(); | ||||
|     if (focused_window) | ||||
|     if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|     { | ||||
|         if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|         { | ||||
|             // Multi-viewport mode: mouse position in OS absolute coordinates (io.MousePos is (0,0) when the mouse is on the upper-left of the primary monitor) | ||||
|             SDL_GetGlobalMouseState(&mx, &my); | ||||
|         // Multi-viewport mode: mouse position in OS absolute coordinates (io.MousePos is (0,0) when the mouse is on the upper-left of the primary monitor) | ||||
|         if (SDL_Window* focused_window = SDL_GetKeyboardFocus()) | ||||
|             if (ImGui::FindViewportByPlatformHandle((void*)focused_window) != NULL) | ||||
|                 io.MousePos = ImVec2((float)mx, (float)my); | ||||
|         } | ||||
|         else | ||||
|                 io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||
|     } | ||||
|     else | ||||
| #endif | ||||
|     { | ||||
|         // Single viewport mode: mouse position in client window coordinates (io.MousePos is (0,0) when the mouse is on the upper-left corner of the app window) | ||||
|         if (SDL_GetWindowFlags(g_Window) & SDL_WINDOW_INPUT_FOCUS) | ||||
|         { | ||||
|             // Single viewport mode: mouse position in client window coordinates (io.MousePos is (0,0) when the mouse is on the upper-left corner of the app window) | ||||
|             if (focused_window == g_Window) | ||||
|                 io.MousePos = ImVec2((float)mx, (float)my); | ||||
|             int window_x, window_y; | ||||
|             SDL_GetWindowPosition(g_Window, &window_x, &window_y); | ||||
|             io.MousePos = ImVec2((float)(mouse_x - window_x), (float)(mouse_y - window_y)); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // We already retrieve global mouse position, SDL_CaptureMouse() also let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't trigger the OS window resize cursor | ||||
|     // The function is only supported from SDL 2.0.4 (released Jan 2016) | ||||
| #if SDL_HAS_CAPTURE_MOUSE  | ||||
|     bool any_mouse_button_down = ImGui::IsAnyMouseDown(); | ||||
|     SDL_CaptureMouse(any_mouse_button_down ? SDL_TRUE : SDL_FALSE); | ||||
| #else | ||||
|     if (SDL_GetWindowFlags(g_Window) & SDL_WINDOW_INPUT_FOCUS) | ||||
|         io.MousePos = ImVec2((float)mx, (float)my); | ||||
| #endif | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user