mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +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); |     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     int mx, my; |     int mouse_x, mouse_y; | ||||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mx, &my); |     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[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[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; |     io.MouseDown[2] = g_MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; | ||||||
|     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; |     g_MousePressed[0] = g_MousePressed[1] = g_MousePressed[2] = false; | ||||||
|  |  | ||||||
| #if SDL_HAS_CAPTURE_MOUSE && !defined(__EMSCRIPTEN__) | #if SDL_HAS_CAPTURE_MOUSE && !defined(__EMSCRIPTEN__) | ||||||
|     SDL_Window* focused_window = SDL_GetKeyboardFocus(); |     if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||||
|     if (focused_window) |  | ||||||
|     { |     { | ||||||
|         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) | ||||||
|         { |         if (SDL_Window* focused_window = SDL_GetKeyboardFocus()) | ||||||
|             // 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); |  | ||||||
|             if (ImGui::FindViewportByPlatformHandle((void*)focused_window) != NULL) |             if (ImGui::FindViewportByPlatformHandle((void*)focused_window) != NULL) | ||||||
|                 io.MousePos = ImVec2((float)mx, (float)my); |                 io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||||
|         } |     } | ||||||
|         else |     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) |             int window_x, window_y; | ||||||
|             if (focused_window == g_Window) |             SDL_GetWindowPosition(g_Window, &window_x, &window_y); | ||||||
|                 io.MousePos = ImVec2((float)mx, (float)my); |             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 |     // 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) |     // 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(); |     bool any_mouse_button_down = ImGui::IsAnyMouseDown(); | ||||||
|     SDL_CaptureMouse(any_mouse_button_down ? SDL_TRUE : SDL_FALSE); |     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 | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user