mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # backends/imgui_impl_glfw.cpp # backends/imgui_impl_sdl.cpp # backends/imgui_impl_win32.cpp # imgui.cpp
This commit is contained in:
		| @@ -21,6 +21,7 @@ | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2021-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | ||||
| //  2021-07-29: *BREAKING CHANGE*: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using glfwSetCursorEnterCallback). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install the glfwSetCursorEnterCallback() callback and the forward to the backend via ImGui_ImplGlfw_CursorEnterCallback(). | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| //  2020-01-17: Inputs: Disable error callback while assigning mouse cursors because some X11 setup don't have them and it generates errors. | ||||
| //  2019-12-05: Inputs: Added support for new mouse cursors added in GLFW 3.4+ (resizing cursors, not allowed cursor). | ||||
| @@ -87,6 +88,7 @@ struct ImGui_ImplGlfw_Data | ||||
|     GLFWwindow*             Window; | ||||
|     GlfwClientApi           ClientApi; | ||||
|     double                  Time; | ||||
|     GLFWwindow*             MouseWindow; | ||||
|     bool                    MouseJustPressed[ImGuiMouseButton_COUNT]; | ||||
|     GLFWcursor*             MouseCursors[ImGuiMouseCursor_COUNT]; | ||||
|     GLFWwindow*             KeyOwnerWindows[512]; | ||||
| @@ -94,6 +96,7 @@ struct ImGui_ImplGlfw_Data | ||||
|     bool                    WantUpdateMonitors; | ||||
|  | ||||
|     // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. | ||||
|     GLFWcursorenterfun      PrevUserCallbackCursorEnter; | ||||
|     GLFWmousebuttonfun      PrevUserCallbackMousebutton; | ||||
|     GLFWscrollfun           PrevUserCallbackScroll; | ||||
|     GLFWkeyfun              PrevUserCallbackKey; | ||||
| @@ -184,6 +187,17 @@ void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int a | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|     if (bd->PrevUserCallbackCursorEnter != NULL) | ||||
|         bd->PrevUserCallbackCursorEnter(window, entered); | ||||
|     if (entered) | ||||
|         bd->MouseWindow = window; | ||||
|     if (!entered && bd->MouseWindow == window) | ||||
|         bd->MouseWindow = NULL; | ||||
| } | ||||
|  | ||||
| void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c) | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
| @@ -280,6 +294,7 @@ static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, Glfw | ||||
|     if (install_callbacks) | ||||
|     { | ||||
|         bd->InstalledCallbacks = true; | ||||
|         bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); | ||||
|         bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); | ||||
|         bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); | ||||
|         bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback); | ||||
| @@ -328,6 +343,7 @@ void ImGui_ImplGlfw_Shutdown() | ||||
|  | ||||
|     if (bd->InstalledCallbacks) | ||||
|     { | ||||
|         glfwSetCursorEnterCallback(bd->Window, bd->PrevUserCallbackCursorEnter); | ||||
|         glfwSetMouseButtonCallback(bd->Window, bd->PrevUserCallbackMousebutton); | ||||
|         glfwSetScrollCallback(bd->Window, bd->PrevUserCallbackScroll); | ||||
|         glfwSetKeyCallback(bd->Window, bd->PrevUserCallbackKey); | ||||
| @@ -346,57 +362,59 @@ void ImGui_ImplGlfw_Shutdown() | ||||
| static void ImGui_ImplGlfw_UpdateMousePosAndButtons() | ||||
| { | ||||
|     ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); | ||||
|  | ||||
|     // Update buttons | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); | ||||
|  | ||||
|     const ImVec2 mouse_pos_prev = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     io.MouseHoveredViewport = 0; | ||||
|  | ||||
|     // Update mouse button | ||||
|     // (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) | ||||
|     for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||
|     { | ||||
|         // 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[i] = bd->MouseJustPressed[i] || glfwGetMouseButton(bd->Window, i) != 0; | ||||
|         bd->MouseJustPressed[i] = false; | ||||
|     } | ||||
|  | ||||
|     // Update mouse position | ||||
|     const ImVec2 mouse_pos_backup = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     io.MouseHoveredViewport = 0; | ||||
|     ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO(); | ||||
|     for (int n = 0; n < platform_io.Viewports.Size; n++) | ||||
|     { | ||||
|         ImGuiViewport* viewport = platform_io.Viewports[n]; | ||||
|         GLFWwindow* window = (GLFWwindow*)viewport->PlatformHandle; | ||||
|         IM_ASSERT(window != NULL); | ||||
|  | ||||
| #ifdef __EMSCRIPTEN__ | ||||
|         const bool focused = true; | ||||
|         IM_ASSERT(platform_io.Viewports.Size == 1); | ||||
| #else | ||||
|         const bool focused = glfwGetWindowAttrib(window, GLFW_FOCUSED) != 0; | ||||
| #endif | ||||
|         // Update mouse buttons | ||||
|         if (focused) | ||||
|             for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||
|                 io.MouseDown[i] |= glfwGetMouseButton(window, i) != 0; | ||||
|  | ||||
|         // Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|         // (When multi-viewports are enabled, all Dear ImGui positions are same as OS positions) | ||||
|         if (io.WantSetMousePos && focused) | ||||
|             glfwSetCursorPos(window, (double)(mouse_pos_prev.x - viewport->Pos.x), (double)(mouse_pos_prev.y - viewport->Pos.y)); | ||||
|  | ||||
|         // Set Dear ImGui mouse position from OS position | ||||
|         if (bd->MouseWindow == window || focused) | ||||
|         { | ||||
|             if (io.WantSetMousePos) | ||||
|             double mouse_x, mouse_y; | ||||
|             glfwGetCursorPos(window, &mouse_x, &mouse_y); | ||||
|             if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|             { | ||||
|                 glfwSetCursorPos(window, (double)(mouse_pos_backup.x - viewport->Pos.x), (double)(mouse_pos_backup.y - viewport->Pos.y)); | ||||
|                 // 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) | ||||
|                 int window_x, window_y; | ||||
|                 glfwGetWindowPos(window, &window_x, &window_y); | ||||
|                 io.MousePos = ImVec2((float)mouse_x + window_x, (float)mouse_y + window_y); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 double mouse_x, mouse_y; | ||||
|                 glfwGetCursorPos(window, &mouse_x, &mouse_y); | ||||
|                 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) | ||||
|                     int window_x, window_y; | ||||
|                     glfwGetWindowPos(window, &window_x, &window_y); | ||||
|                     io.MousePos = ImVec2((float)mouse_x + window_x, (float)mouse_y + window_y); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     // 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) | ||||
|                     io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||
|                 } | ||||
|                 // 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) | ||||
|                 io.MousePos = ImVec2((float)mouse_x, (float)mouse_y); | ||||
|             } | ||||
|             for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) | ||||
|                 io.MouseDown[i] |= glfwGetMouseButton(window, i) != 0; | ||||
|         } | ||||
|  | ||||
|         // (Optional) When using multiple viewports: set io.MouseHoveredViewport to the viewport the OS mouse cursor is hovering. | ||||
| @@ -633,6 +651,7 @@ static void ImGui_ImplGlfw_CreateWindow(ImGuiViewport* viewport) | ||||
|     glfwSetWindowPos(vd->Window, (int)viewport->Pos.x, (int)viewport->Pos.y); | ||||
|  | ||||
|     // Install GLFW callbacks for secondary viewports | ||||
|     glfwSetCursorEnterCallback(vd->Window, ImGui_ImplGlfw_CursorEnterCallback); | ||||
|     glfwSetMouseButtonCallback(vd->Window, ImGui_ImplGlfw_MouseButtonCallback); | ||||
|     glfwSetScrollCallback(vd->Window, ImGui_ImplGlfw_ScrollCallback); | ||||
|     glfwSetKeyCallback(vd->Window, ImGui_ImplGlfw_KeyCallback); | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| // Issues: | ||||
| //  [ ] Platform: Multi-viewport support: ParentViewportID not honored, and so io.ConfigViewportsNoDefaultParent has no effect (minor). | ||||
|  | ||||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.  | ||||
| // You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. | ||||
| // Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. | ||||
| // If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. | ||||
| // Read online: https://github.com/ocornut/imgui/tree/master/docs | ||||
| @@ -36,6 +36,7 @@ IMGUI_IMPL_API void     ImGui_ImplGlfw_NewFrame(); | ||||
| // GLFW callbacks | ||||
| // - When calling Init with 'install_callbacks=true': GLFW callbacks will be installed for you. They will call user's previously installed callbacks, if any. | ||||
| // - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call those function yourself from your own GLFW callbacks. | ||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered); | ||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods); | ||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset); | ||||
| IMGUI_IMPL_API void     ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| // dear imgui: Platform Backend for SDL2 | ||||
| // This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) | ||||
| // (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) | ||||
| // (Requires: SDL 2.0. Prefer SDL 2.0.4+ for full feature support.) | ||||
| // (Prefer SDL 2.0.5+ for full feature support.) | ||||
|  | ||||
| // Implemented features: | ||||
| //  [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. | ||||
| @@ -21,6 +21,7 @@ | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2021-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | ||||
| //  2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using SDL_GetMouseFocus() + SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, requires SDL 2.0.5+) | ||||
| //  2021-06:29: *BREAKING CHANGE* Removed 'SDL_Window* window' parameter to ImGui_ImplSDL2_NewFrame() which was unnecessary. | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| //  2021-03-22: Rework global mouse pos availability check listing supported platforms explicitly, effectively fixing mouse access on Raspberry Pi. (#2837, #3950) | ||||
| @@ -62,13 +63,13 @@ | ||||
| #include "TargetConditionals.h" | ||||
| #endif | ||||
|  | ||||
| #define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE    SDL_VERSION_ATLEAST(2,0,4) | ||||
| #define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE    (SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS)) | ||||
| #define SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH    SDL_VERSION_ATLEAST(2,0,5) | ||||
| #define SDL_HAS_WINDOW_ALPHA                SDL_VERSION_ATLEAST(2,0,5) | ||||
| #define SDL_HAS_ALWAYS_ON_TOP               SDL_VERSION_ATLEAST(2,0,5) | ||||
| #define SDL_HAS_USABLE_DISPLAY_BOUNDS       SDL_VERSION_ATLEAST(2,0,5) | ||||
| #define SDL_HAS_PER_MONITOR_DPI             SDL_VERSION_ATLEAST(2,0,4) | ||||
| #define SDL_HAS_VULKAN                      SDL_VERSION_ATLEAST(2,0,6) | ||||
| #define SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH    SDL_VERSION_ATLEAST(2,0,5) | ||||
| #if !SDL_HAS_VULKAN | ||||
| static const Uint32 SDL_WINDOW_VULKAN = 0x10000000; | ||||
| #endif | ||||
| @@ -188,17 +189,28 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, void* sdl_gl_context) | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     IM_ASSERT(io.BackendPlatformUserData == NULL && "Already initialized a platform backend!"); | ||||
|  | ||||
|     // Check and store if we are on a SDL backend that supports global mouse position | ||||
|     // ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list) | ||||
|     const char* sdl_backend = SDL_GetCurrentVideoDriver(); | ||||
|     const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" }; | ||||
|     bool mouse_can_use_global_state = false; | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE | ||||
|     for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++) | ||||
|         if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0) | ||||
|             mouse_can_use_global_state = true; | ||||
| #endif | ||||
|  | ||||
|     // Setup backend capabilities flags | ||||
|     ImGui_ImplSDL2_Data* bd = IM_NEW(ImGui_ImplSDL2_Data)(); | ||||
|     io.BackendPlatformUserData = (void*)bd; | ||||
|     io.BackendPlatformName = "imgui_impl_sdl"; | ||||
|     io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;       // We can honor GetMouseCursor() values (optional) | ||||
|     io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;        // We can honor io.WantSetMousePos requests (optional, rarely used) | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE | ||||
|     io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports;  // We can create multi-viewports on the Platform side (optional) | ||||
| #endif | ||||
|     io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;           // We can honor GetMouseCursor() values (optional) | ||||
|     io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos;            // We can honor io.WantSetMousePos requests (optional, rarely used) | ||||
|     if (mouse_can_use_global_state) | ||||
|         io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports;  // We can create multi-viewports on the Platform side (optional) | ||||
|  | ||||
|     bd->Window = window; | ||||
|     bd->MouseCanUseGlobalState = mouse_can_use_global_state; | ||||
|  | ||||
|     // Keyboard mapping. Dear ImGui will use those indices to peek into the io.KeysDown[] array. | ||||
|     io.KeyMap[ImGuiKey_Tab] = SDL_SCANCODE_TAB; | ||||
| @@ -239,15 +251,6 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, void* sdl_gl_context) | ||||
|     bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); | ||||
|     bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); | ||||
|  | ||||
|     // Check and store if we are on a SDL backend that supports global mouse position | ||||
|     // ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list) | ||||
|     const char* sdl_backend = SDL_GetCurrentVideoDriver(); | ||||
|     const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" }; | ||||
|     bd->MouseCanUseGlobalState = false; | ||||
|     for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++) | ||||
|         if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0) | ||||
|             bd->MouseCanUseGlobalState = true; | ||||
|  | ||||
|     // Our mouse update function expect PlatformHandle to be filled for the main viewport | ||||
|     ImGuiViewport* main_viewport = ImGui::GetMainViewport(); | ||||
|     main_viewport->PlatformHandle = (void*)window; | ||||
| @@ -258,6 +261,15 @@ static bool ImGui_ImplSDL2_Init(SDL_Window* window, void* sdl_gl_context) | ||||
|         main_viewport->PlatformHandleRaw = info.info.win.window; | ||||
| #endif | ||||
|  | ||||
|     // Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event. | ||||
|     // Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered. | ||||
|     // (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application. | ||||
|     // It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click: | ||||
|     // you can ignore SDL_MOUSEBUTTONDOWN events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED) | ||||
| #if SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH | ||||
|     SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); | ||||
| #endif | ||||
|  | ||||
|     // Update monitors | ||||
|     ImGui_ImplSDL2_UpdateMonitors(); | ||||
|  | ||||
| @@ -323,27 +335,11 @@ static void ImGui_ImplSDL2_UpdateMousePosAndButtons() | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); | ||||
|  | ||||
|     ImVec2 mouse_pos_prev = io.MousePos; | ||||
|     io.MouseHoveredViewport = 0; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|  | ||||
|     // [1] | ||||
|     // Only when requested by io.WantSetMousePos: set OS mouse pos from Dear ImGui mouse pos. | ||||
|     // (rarely used, mostly when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|     if (io.WantSetMousePos) | ||||
|     { | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE | ||||
|         if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|             SDL_WarpMouseGlobal((int)io.MousePos.x, (int)io.MousePos.y); | ||||
|         else | ||||
| #endif | ||||
|             SDL_WarpMouseInWindow(bd->Window, (int)io.MousePos.x, (int)io.MousePos.y); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     } | ||||
|  | ||||
|     // [2] | ||||
|     // Set Dear ImGui mouse pos from OS mouse pos + get buttons. (this is the common behavior) | ||||
|     // Update mouse buttons | ||||
|     int mouse_x_local, mouse_y_local; | ||||
|     Uint32 mouse_buttons = SDL_GetMouseState(&mouse_x_local, &mouse_y_local); | ||||
|     io.MouseDown[0] = bd->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. | ||||
| @@ -351,47 +347,60 @@ static void ImGui_ImplSDL2_UpdateMousePosAndButtons() | ||||
|     io.MouseDown[2] = bd->MousePressed[2] || (mouse_buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) != 0; | ||||
|     bd->MousePressed[0] = bd->MousePressed[1] = bd->MousePressed[2] = false; | ||||
|  | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) | ||||
|     // Obtain focused and hovered window. We forward mouse input when focused or when hovered (and no other window is capturing) | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE | ||||
|     SDL_Window* focused_window = SDL_GetKeyboardFocus(); | ||||
|     SDL_Window* hovered_window = SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH ? SDL_GetMouseFocus() : NULL; // This is better but is only reliably useful with SDL 2.0.5+ and SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH. | ||||
|     SDL_Window* mouse_window = NULL; | ||||
|     if (hovered_window && (bd->Window == hovered_window || ImGui::FindViewportByPlatformHandle((void*)hovered_window))) | ||||
|         mouse_window = hovered_window; | ||||
|     else if (focused_window && (bd->Window == focused_window || ImGui::FindViewportByPlatformHandle((void*)focused_window))) | ||||
|         mouse_window = focused_window; | ||||
|  | ||||
|     // SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside | ||||
|     SDL_CaptureMouse(ImGui::IsAnyMouseDown() ? SDL_TRUE : SDL_FALSE); | ||||
| #else | ||||
|     // SDL 2.0.3 and non-windowed systems: single-viewport only | ||||
|     SDL_Window* mouse_window = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) ? bd->Window : NULL; | ||||
| #endif | ||||
|  | ||||
|     if (mouse_window == NULL) | ||||
|         return; | ||||
|  | ||||
|     // Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|     if (io.WantSetMousePos) | ||||
|     { | ||||
| #if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE | ||||
|         if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|             SDL_WarpMouseGlobal((int)mouse_pos_prev.x, (int)mouse_pos_prev.y); | ||||
|         else | ||||
| #endif | ||||
|             SDL_WarpMouseInWindow(bd->Window, (int)mouse_pos_prev.x, (int)mouse_pos_prev.y); | ||||
|     } | ||||
|  | ||||
|     // Set Dear ImGui mouse position from OS position + get buttons. (this is the common behavior) | ||||
|     if (bd->MouseCanUseGlobalState) | ||||
|     { | ||||
|         // SDL 2.0.4 and later has SDL_GetGlobalMouseState() and SDL_CaptureMouse() | ||||
|         int mouse_x_global, mouse_y_global; | ||||
|         SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global); | ||||
|  | ||||
|         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()) | ||||
|                 if (ImGui::FindViewportByPlatformHandle((void*)focused_window) != NULL) | ||||
|                     io.MousePos = ImVec2((float)mouse_x_global, (float)mouse_y_global); | ||||
|             io.MousePos = ImVec2((float)mouse_x_global, (float)mouse_y_global); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // Single-viewport mode: mouse position in client window coordinatesio.MousePos is (0,0) when the mouse is on the upper-left corner of the app window) | ||||
|             if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) | ||||
|             { | ||||
|                 int window_x, window_y; | ||||
|                 SDL_GetWindowPosition(bd->Window, &window_x, &window_y); | ||||
|                 io.MousePos = ImVec2((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y)); | ||||
|             } | ||||
|             // 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) | ||||
|             // Unlike local position obtained earlier this will be valid when straying out of bounds too. | ||||
|             int window_x, window_y; | ||||
|             SDL_GetWindowPosition(mouse_window, &window_x, &window_y); | ||||
|             io.MousePos = ImVec2((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y)); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) | ||||
|             io.MousePos = ImVec2((float)mouse_x_local, (float)mouse_y_local); | ||||
|     } | ||||
|  | ||||
|     // SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger the OS window resize cursor. | ||||
|     // The function is only supported from SDL 2.0.4 (released Jan 2016) | ||||
|     bool any_mouse_button_down = ImGui::IsAnyMouseDown(); | ||||
|     SDL_CaptureMouse(any_mouse_button_down ? SDL_TRUE : SDL_FALSE); | ||||
| #else | ||||
|     // SDL 2.0.3 and before: single-viewport only | ||||
|     if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) | ||||
|         io.MousePos = ImVec2((float)mouse_x_local, (float)mouse_y_local); | ||||
| #endif | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void ImGui_ImplSDL2_UpdateMouseCursor() | ||||
| @@ -739,11 +748,6 @@ static void ImGui_ImplSDL2_InitPlatformInterface(SDL_Window* window, void* sdl_g | ||||
|     platform_io.Platform_CreateVkSurface = ImGui_ImplSDL2_CreateVkSurface; | ||||
| #endif | ||||
|  | ||||
|     // SDL2 by default doesn't pass mouse clicks to the application when the click focused a window. This is getting in the way of our interactions and we disable that behavior. | ||||
| #if SDL_HAS_MOUSE_FOCUS_CLICKTHROUGH | ||||
|     SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); | ||||
| #endif | ||||
|  | ||||
|     // Register main window handle (which is owned by the main application, not by us) | ||||
|     // This is mostly for simplicity and consistency, so that our code (e.g. mouse handling etc.) can use same logic for main and secondary viewports. | ||||
|     ImGuiViewport* main_viewport = ImGui::GetMainViewport(); | ||||
|   | ||||
| @@ -35,6 +35,7 @@ typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*); | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2021-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | ||||
| //  2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events). | ||||
| //  2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). | ||||
| //  2021-06-08: Fix ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1). | ||||
| //  2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS). | ||||
| @@ -75,6 +76,8 @@ static void ImGui_ImplWin32_UpdateMonitors(); | ||||
| struct ImGui_ImplWin32_Data | ||||
| { | ||||
|     HWND                        hWnd; | ||||
|     HWND                        MouseHwnd; | ||||
|     bool                        MouseTracked; | ||||
|     INT64                       Time; | ||||
|     INT64                       TicksPerSecond; | ||||
|     ImGuiMouseCursor            LastMouseCursor; | ||||
| @@ -235,49 +238,52 @@ static bool ImGui_ImplWin32_UpdateMouseCursor() | ||||
| // Because of that, it is a little more complicated than your typical single-viewport binding code! | ||||
| static void ImGui_ImplWin32_UpdateMousePos() | ||||
| { | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     IM_ASSERT(bd->hWnd != 0); | ||||
|  | ||||
|     // Set OS mouse position if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|     // (When multi-viewports are enabled, all imgui positions are same as OS positions) | ||||
|     if (io.WantSetMousePos) | ||||
|     { | ||||
|         POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y }; | ||||
|         if ((io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) == 0) | ||||
|             ::ClientToScreen(bd->hWnd, &pos); | ||||
|         ::SetCursorPos(pos.x, pos.y); | ||||
|     } | ||||
|  | ||||
|     const ImVec2 mouse_pos_prev = io.MousePos; | ||||
|     io.MousePos = ImVec2(-FLT_MAX, -FLT_MAX); | ||||
|     io.MouseHoveredViewport = 0; | ||||
|  | ||||
|     // Set imgui mouse position | ||||
|     // Obtain focused and hovered window. We forward mouse input when focused or when hovered (and no other window is capturing) | ||||
|     HWND focused_window = ::GetForegroundWindow(); | ||||
|     HWND hovered_window = bd->MouseHwnd; | ||||
|     HWND mouse_window = NULL; | ||||
|     if (hovered_window && (hovered_window == bd->hWnd || ::IsChild(hovered_window, bd->hWnd) || ImGui::FindViewportByPlatformHandle((void*)hovered_window))) | ||||
|         mouse_window = hovered_window; | ||||
|     else if (focused_window && (focused_window == bd->hWnd || ::IsChild(focused_window, bd->hWnd) || ImGui::FindViewportByPlatformHandle((void*)focused_window))) | ||||
|         mouse_window = focused_window; | ||||
|     if (mouse_window == NULL) | ||||
|         return; | ||||
|  | ||||
|     // Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) | ||||
|     // (When multi-viewports are enabled, all Dear ImGui positions are same as OS positions) | ||||
|     if (io.WantSetMousePos && mouse_window != NULL) | ||||
|     { | ||||
|         POINT pos = { (int)mouse_pos_prev.x, (int)mouse_pos_prev.y }; | ||||
|         if ((io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) == 0) | ||||
|             ::ClientToScreen(mouse_window, &pos); | ||||
|         ::SetCursorPos(pos.x, pos.y); | ||||
|     } | ||||
|  | ||||
|     // Set Dear ImGui mouse position from OS position | ||||
|     POINT mouse_screen_pos; | ||||
|     if (!::GetCursorPos(&mouse_screen_pos)) | ||||
|         return; | ||||
|     if (HWND focused_hwnd = ::GetForegroundWindow()) | ||||
|     if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|     { | ||||
|         if (::IsChild(focused_hwnd, bd->hWnd)) | ||||
|             focused_hwnd = bd->hWnd; | ||||
|         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) | ||||
|             // This is the position you can get with GetCursorPos(). In theory adding viewport->Pos is also the reverse operation of doing ScreenToClient(). | ||||
|             if (ImGui::FindViewportByPlatformHandle((void*)focused_hwnd) != NULL) | ||||
|                 io.MousePos = ImVec2((float)mouse_screen_pos.x, (float)mouse_screen_pos.y); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // 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.) | ||||
|             // This is the position you can get with GetCursorPos() + ScreenToClient() or from WM_MOUSEMOVE. | ||||
|             if (focused_hwnd == bd->hWnd) | ||||
|             { | ||||
|                 POINT mouse_client_pos = mouse_screen_pos; | ||||
|                 ::ScreenToClient(focused_hwnd, &mouse_client_pos); | ||||
|                 io.MousePos = ImVec2((float)mouse_client_pos.x, (float)mouse_client_pos.y); | ||||
|             } | ||||
|         } | ||||
|         // 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) | ||||
|         // This is the position you can get with ::GetCursorPos() or WM_MOUSEMOVE + ::ClientToScreen(). In theory adding viewport->Pos to a client position would also be the same. | ||||
|         io.MousePos = ImVec2((float)mouse_screen_pos.x, (float)mouse_screen_pos.y); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // 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) | ||||
|         // This is the position you can get with ::GetCursorPos() + ::ScreenToClient() or WM_MOUSEMOVE. | ||||
|         POINT mouse_client_pos = mouse_screen_pos; | ||||
|         ::ScreenToClient(bd->hWnd, &mouse_client_pos); | ||||
|         io.MousePos = ImVec2((float)mouse_client_pos.x, (float)mouse_client_pos.y); | ||||
|     } | ||||
|  | ||||
|     // (Optional) When using multiple viewports: set io.MouseHoveredViewport to the viewport the OS mouse cursor is hovering. | ||||
| @@ -441,6 +447,21 @@ IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARA | ||||
|  | ||||
|     switch (msg) | ||||
|     { | ||||
|     case WM_MOUSEMOVE: | ||||
|         // We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events | ||||
|         bd->MouseHwnd = hwnd; | ||||
|         if (!bd->MouseTracked) | ||||
|         { | ||||
|             TRACKMOUSEEVENT tme = { sizeof(tme), TME_LEAVE, hwnd, 0 }; | ||||
|             ::TrackMouseEvent(&tme); | ||||
|             bd->MouseTracked = true; | ||||
|         } | ||||
|         break; | ||||
|     case WM_MOUSELEAVE: | ||||
|         if (bd->MouseHwnd == hwnd) | ||||
|             bd->MouseHwnd = NULL; | ||||
|         bd->MouseTracked = false; | ||||
|         break; | ||||
|     case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: | ||||
|     case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: | ||||
|     case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: | ||||
|   | ||||
| @@ -105,8 +105,20 @@ Other changes: | ||||
|  | ||||
| Breaking Changes: | ||||
|  | ||||
| - Commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 (March 2019): | ||||
|   - ImGui::GetOverlayDrawList() -> use ImGui::GetForegroundDrawList() | ||||
|   - ImFont::GlyphRangesBuilder  -> use ImFontGlyphRangesBuilder | ||||
| - Backends: GLFW: backend now needs to use glfwSetCursorEnterCallback(). (#3751, #4377, #2445) | ||||
|   - If calling ImGui_ImplGlfw_InitXXX with install_callbacks=true: this is already done for you. | ||||
|   - If calling ImGui_ImplGlfw_InitXXX with install_callbacks=false: you WILL NEED to register the GLFW callback | ||||
|     with glfwSetCursorEnterCallback(), and forward events to the backend via ImGui_ImplGlfw_CursorEnterCallback(). | ||||
| - Backends: SDL2: removed unnecessary SDL_Window* parameter from ImGui_ImplSDL2_NewFrame(). (#3244) [@funchal] | ||||
|   Kept inline redirection function (will obsolete). | ||||
| - Backends: SDL2: backend needs to set 'SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1")' in order to | ||||
|   receive mouse clicks events on window focus, otherwise SDL doesn't emit the event. (#3751, #4377, #2445) | ||||
|   This is unfortunately a global SDL setting, so enabling it _might_ have a side-effect on your application. | ||||
|   It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click: | ||||
|   you can ignore SDL_MOUSEBUTTONDOWN that events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED event). | ||||
| - Internals: (for custom widgets): because disabled items now sets HoveredId, if you want custom widgets to | ||||
|   not react as hovered when disabled, in the majority of use cases it is preferable to check the "hovered" | ||||
|   return value of ButtonBehavior() rather than (HoveredId == id). | ||||
| @@ -127,6 +139,7 @@ Other Changes: | ||||
| - Drag and Drop: drop target highlight doesn't try to bypass host clipping rectangle. (#4281, #3272) | ||||
| - Menus: MenuItem() and BeginMenu() are not affected/overlapping when style.SelectableTextAlign is altered. | ||||
| - Menus: fix hovering a disabled menu or menu item not closing other menus. (#211) | ||||
| - Popups: fix BeginPopup/OpenPopup sequence failing when there are no focused windows. (#4308) [@rokups] | ||||
| - Nav: Disabled items are not candidate for default focus. (#211, #787) | ||||
| - Disabled: disabled items set HoveredId, allowing e.g. HoveredIdTimer to function. (#211, #3419) [@rokups] | ||||
| - Disabled: disabled mode more consistently release active id if the active item got disabled. (#211) | ||||
| @@ -152,6 +165,12 @@ Other Changes: | ||||
|   - ImGui_ImplWin32_EnableDpiAwareness() will call SetProcessDpiAwareness() fallback on Windows 8.1 without a manifest. | ||||
| - Backends: Win32: IME functions are disabled by default for non-Visual Studio compilers (MinGW etc.). Enable with | ||||
|   '#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS' for those compilers. Undo change from 1.82. (#2590, #738, #4185, #4301) | ||||
| - Backends: Win32: Mouse position is correctly reported when the host window is hovered but not focused. (#2445, #2696, #3751, #4377) | ||||
| - Backends: GLFW: Mouse position is correctly reported when the host window is hovered but not focused. (#3751, #4377, #2445) | ||||
|   (backend now uses glfwSetCursorEnterCallback(). If you called ImGui_ImplGlfw_InitXXX with install_callbacks=false, you will | ||||
|   need to install this callback and forward the data to the backend via ImGui_ImplGlfw_CursorEnterCallback). | ||||
| - Backends: SDL2: Mouse position is correctly reported when the host window is hovered but not focused. (#3751, #4377, #2445) | ||||
|   (requires SDL 2.0.5+ as SDL_GetMouseFocus() is only usable with SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH). | ||||
| - Backends: DX9: Explicitly disable texture state stages after >= 1. (#4268) [@NZJenkins] | ||||
| - Backends: DX12: Fix texture casting crash on 32-bit systems (introduced on 2021/05/19 and v1.83) + added comments | ||||
|   about building on 32-bit systems. (#4225) [@kingofthebongo2008] | ||||
| @@ -160,6 +179,8 @@ Other Changes: | ||||
| - Backends: OpenGL3: Use OES_vertex_array extension on Emscripten + backup/restore current state. (#4266, #4267) [@harry75369] | ||||
| - Backends: GLFW: Installing and exposed ImGui_ImplGlfw_MonitorCallback() for forward compatibility with docking branch. | ||||
| - Backends: OSX: Added a fix for shortcuts using CTRL key instead of CMD key. (#4253) [@rokups] | ||||
| - Examples: DX12: Fixed handling of Alt+Enter in example app (using swapchain's ResizeBuffers). (#4346) [@PathogenDavid] | ||||
| - Examples: DX12: Removed unecessary recreation of backend-owned device objects when window is resized. (#4347) [@PathogenDavid] | ||||
| - Examples: OSX+OpenGL2: Fix event forwarding (fix key remaining stuck when using shortcuts with Cmd/Super key). | ||||
|   Other OSX examples were not affected. (#4253, #1873) [@rokups] | ||||
| - Examples: Updated all .vcxproj to VS2015 (toolset v140) to facilitate usage with vcpkg. | ||||
| @@ -184,7 +205,7 @@ Docking+Viewports Branch: | ||||
|  | ||||
|  | ||||
| ----------------------------------------------------------------------- | ||||
|  VERSION 1.83 (Released 2011-05-24) | ||||
|  VERSION 1.83 (Released 2021-05-24) | ||||
| ----------------------------------------------------------------------- | ||||
|  | ||||
| Decorated log: https://github.com/ocornut/imgui/releases/tag/v1.83 | ||||
| @@ -242,7 +263,7 @@ Other Changes: | ||||
| - ImDrawList: Fixed PathArcTo() regression from 1.82 preventing use of counter-clockwise angles. (#4030, #3491) [@thedmd] | ||||
| - Demo: Improved popups demo and comments. | ||||
| - Metrics: Added "Fonts" section with same information as available in "Style Editor">"Fonts". | ||||
| - Backends: SDL: Rework global mouse pos availability check listing supported platforms explicitly, | ||||
| - Backends: SDL2: Rework global mouse pos availability check listing supported platforms explicitly, | ||||
|   effectively fixing mouse access on Raspberry Pi. (#2837, #3950) [@lethal-guitar, @hinxx] | ||||
| - Backends: Win32: Clearing keyboard down array when losing focus (WM_KILLFOCUS). (#2062, #3532, #3961) | ||||
|   [@1025798851] | ||||
|   | ||||
							
								
								
									
										14
									
								
								docs/FAQ.md
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								docs/FAQ.md
									
									
									
									
									
								
							| @@ -225,8 +225,11 @@ End(); | ||||
|  | ||||
| - If you have a same ID twice in the same location, you'll have a conflict: | ||||
| ```cpp | ||||
| Begin("MyWindow"); | ||||
| Button("OK"); | ||||
| Button("OK");          // ID collision! Interacting with either button will trigger the first one. | ||||
| Button("OK");      // ERROR: ID collision with the first button! Interacting with either button will trigger the first one. | ||||
| Button("");        // ERROR: ID collision with Begin("MyWindow")! | ||||
| End(); | ||||
| ``` | ||||
| Fear not! this is easy to solve and there are many ways to solve it! | ||||
|  | ||||
| @@ -238,8 +241,9 @@ are going to be created: | ||||
| ```cpp | ||||
| Begin("MyWindow"); | ||||
| Button("Play");        // Label = "Play",   ID = hash of ("MyWindow", "Play") | ||||
| Button("Play##foo1");  // Label = "Play",   ID = hash of ("MyWindow", "Play##foo1")  // Different from above | ||||
| Button("Play##foo2");  // Label = "Play",   ID = hash of ("MyWindow", "Play##foo2")  // Different from above | ||||
| Button("Play##foo1");  // Label = "Play",   ID = hash of ("MyWindow", "Play##foo1")  // Different from other buttons | ||||
| Button("Play##foo2");  // Label = "Play",   ID = hash of ("MyWindow", "Play##foo2")  // Different from other buttons | ||||
| Button("##foo");       // Label = "",       ID = hash of ("MyWindow", "##foo")       // Different from window | ||||
| End(); | ||||
| ``` | ||||
| - If you want to completely hide the label, but still need an ID: | ||||
| @@ -257,7 +261,7 @@ sprintf(buf, "My game (%f FPS)###MyGame", fps); | ||||
| Begin(buf);            // Variable title,   ID = hash of "MyGame" | ||||
| ``` | ||||
| - Solving ID conflict in a more general manner: | ||||
| Use PushID() / PopID() to create scopes and manipulate the ID stack, as to avoid ID conflicts | ||||
| Use `PushID()` / `PopID()` to create scopes and manipulate the ID stack, as to avoid ID conflicts | ||||
| within the same window. This is the most convenient way of distinguishing ID when iterating and | ||||
| creating many UI elements programmatically. | ||||
| You can push a pointer, a string or an integer value into the ID stack. | ||||
| @@ -297,7 +301,7 @@ PushID("node"); | ||||
|   PopID(); | ||||
| PopID(); | ||||
| ``` | ||||
| - Tree nodes implicitly creates a scope for you by calling PushID(). | ||||
| - Tree nodes implicitly creates a scope for you by calling `PushID()`: | ||||
| ```cpp | ||||
| Button("Click");       // Label = "Click",  ID = hash of (..., "Click") | ||||
| if (TreeNode("node"))  // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag) | ||||
|   | ||||
| @@ -54,7 +54,6 @@ void CreateRenderTarget(); | ||||
| void CleanupRenderTarget(); | ||||
| void WaitForLastSubmittedFrame(); | ||||
| FrameContext* WaitForNextFrameResources(); | ||||
| void ResizeSwapChain(HWND hWnd, int width, int height); | ||||
| LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
|  | ||||
| // Main code | ||||
| @@ -371,7 +370,7 @@ bool CreateDeviceD3D(HWND hWnd) | ||||
| void CleanupDeviceD3D() | ||||
| { | ||||
|     CleanupRenderTarget(); | ||||
|     if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } | ||||
|     if (g_pSwapChain) { g_pSwapChain->SetFullscreenState(false, NULL); g_pSwapChain->Release(); g_pSwapChain = NULL; } | ||||
|     if (g_hSwapChainWaitableObject != NULL) { CloseHandle(g_hSwapChainWaitableObject); } | ||||
|     for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) | ||||
|         if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = NULL; } | ||||
| @@ -451,31 +450,6 @@ FrameContext* WaitForNextFrameResources() | ||||
|     return frameCtx; | ||||
| } | ||||
|  | ||||
| void ResizeSwapChain(HWND hWnd, int width, int height) | ||||
| { | ||||
|     DXGI_SWAP_CHAIN_DESC1 sd; | ||||
|     g_pSwapChain->GetDesc1(&sd); | ||||
|     sd.Width = width; | ||||
|     sd.Height = height; | ||||
|  | ||||
|     IDXGIFactory4* dxgiFactory = NULL; | ||||
|     g_pSwapChain->GetParent(IID_PPV_ARGS(&dxgiFactory)); | ||||
|  | ||||
|     g_pSwapChain->Release(); | ||||
|     CloseHandle(g_hSwapChainWaitableObject); | ||||
|  | ||||
|     IDXGISwapChain1* swapChain1 = NULL; | ||||
|     dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1); | ||||
|     swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)); | ||||
|     swapChain1->Release(); | ||||
|     dxgiFactory->Release(); | ||||
|  | ||||
|     g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS); | ||||
|  | ||||
|     g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject(); | ||||
|     assert(g_hSwapChainWaitableObject != NULL); | ||||
| } | ||||
|  | ||||
| // Forward declare message handler from imgui_impl_win32.cpp | ||||
| extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); | ||||
|  | ||||
| @@ -491,11 +465,10 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) | ||||
|         if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) | ||||
|         { | ||||
|             WaitForLastSubmittedFrame(); | ||||
|             ImGui_ImplDX12_InvalidateDeviceObjects(); | ||||
|             CleanupRenderTarget(); | ||||
|             ResizeSwapChain(hWnd, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); | ||||
|             HRESULT result = g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT); | ||||
|             assert(SUCCEEDED(result) && "Failed to resize swapchain."); | ||||
|             CreateRenderTarget(); | ||||
|             ImGui_ImplDX12_CreateDeviceObjects(); | ||||
|         } | ||||
|         return 0; | ||||
|     case WM_SYSCOMMAND: | ||||
|   | ||||
| @@ -386,6 +386,9 @@ CODE | ||||
|  - 2021/XX/XX (1.XX) - Moved IME support functions from io.ImeSetInputScreenPosFn, io.ImeWindowHandle to the PlatformIO api. | ||||
|  | ||||
|  | ||||
|  - 2021/07/26 (1.84) - commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 (March 2019): | ||||
|                         - ImGui::GetOverlayDrawList() -> use ImGui::GetForegroundDrawList() | ||||
|                         - ImFont::GlyphRangesBuilder  -> use ImFontGlyphRangesBuilder | ||||
|  - 2021/05/19 (1.83) - backends: obsoleted direct access to ImDrawCmd::TextureId in favor of calling ImDrawCmd::GetTexID(). | ||||
|                         - if you are using official backends from the source tree: you have nothing to do. | ||||
|                         - if you have copied old backend code or using your own: change access to draw_cmd->TextureId to draw_cmd->GetTexID(). | ||||
| @@ -4247,7 +4250,6 @@ void ImGui::NewFrame() | ||||
|     g.ItemFlagsStack.resize(0); | ||||
|     g.ItemFlagsStack.push_back(ImGuiItemFlags_None); | ||||
|     g.GroupStack.resize(0); | ||||
|     ClosePopupsOverWindow(g.NavWindow, false); | ||||
|  | ||||
|     // Docking | ||||
|     DockContextNewFrameUpdateDocking(&g); | ||||
|   | ||||
							
								
								
									
										28
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -62,7 +62,7 @@ Index of this file: | ||||
| // Version | ||||
| // (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens) | ||||
| #define IMGUI_VERSION               "1.84 WIP" | ||||
| #define IMGUI_VERSION_NUM           18311 | ||||
| #define IMGUI_VERSION_NUM           18313 | ||||
| #define IMGUI_CHECKVERSION()        ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) | ||||
| #define IMGUI_HAS_TABLE | ||||
| #define IMGUI_HAS_VIEWPORT          // Viewport WIP branch | ||||
| @@ -1640,13 +1640,13 @@ enum ImGuiColorEditFlags_ | ||||
|  | ||||
|     // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to | ||||
|     // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup. | ||||
|     ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, | ||||
|     ImGuiColorEditFlags_DefaultOptions_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, | ||||
|  | ||||
|     // [Internal] Masks | ||||
|     ImGuiColorEditFlags__DisplayMask    = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, | ||||
|     ImGuiColorEditFlags__DataTypeMask   = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, | ||||
|     ImGuiColorEditFlags__PickerMask     = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, | ||||
|     ImGuiColorEditFlags__InputMask      = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV | ||||
|     ImGuiColorEditFlags_DisplayMask_    = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, | ||||
|     ImGuiColorEditFlags_DataTypeMask_   = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, | ||||
|     ImGuiColorEditFlags_PickerMask_     = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, | ||||
|     ImGuiColorEditFlags_InputMask_      = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV | ||||
|  | ||||
|     // Obsolete names (will be removed) | ||||
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||
| @@ -2806,7 +2806,7 @@ struct ImFontAtlas | ||||
|  | ||||
| #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS | ||||
|     typedef ImFontAtlasCustomRect    CustomRect;         // OBSOLETED in 1.72+ | ||||
|     typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ | ||||
|     //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ | ||||
| #endif | ||||
| }; | ||||
|  | ||||
| @@ -3085,8 +3085,18 @@ namespace ImGui | ||||
|     static inline void  SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } | ||||
|     // OBSOLETED in 1.70 (from May 2019) | ||||
|     static inline float GetContentRegionAvailWidth()        { return GetContentRegionAvail().x; } | ||||
|     // OBSOLETED in 1.69 (from Mar 2019) | ||||
|     static inline ImDrawList* GetOverlayDrawList()          { return GetForegroundDrawList(); } | ||||
|  | ||||
|     // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) | ||||
|     //static inline ImDrawList* GetOverlayDrawList()            { return GetForegroundDrawList(); }                         // OBSOLETED in 1.69 (from Mar 2019) | ||||
|     //static inline void  SetScrollHere(float ratio = 0.5f)     { SetScrollHereY(ratio); }                                  // OBSOLETED in 1.66 (from Nov 2018) | ||||
|     //static inline bool  IsItemDeactivatedAfterChange()        { return IsItemDeactivatedAfterEdit(); }                    // OBSOLETED in 1.63 (from Aug 2018) | ||||
|     //static inline bool  IsAnyWindowFocused()                  { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); }    // OBSOLETED in 1.60 (from Apr 2018) | ||||
|     //static inline bool  IsAnyWindowHovered()                  { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }    // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018) | ||||
|     //static inline void  ShowTestWindow()                      { return ShowDemoWindow(); }                                // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) | ||||
|     //static inline bool  IsRootWindowFocused()                 { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); }   // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) | ||||
|     //static inline bool  IsRootWindowOrAnyChildFocused()       { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) | ||||
|     //static inline void  SetNextWindowContentWidth(float w)    { SetNextWindowContentSize(ImVec2(w, 0.0f)); }              // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) | ||||
|     //static inline float GetItemsLineHeightWithSpacing()       { return GetFrameHeightWithSpacing(); }                     // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) | ||||
| } | ||||
|  | ||||
| // OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() | ||||
|   | ||||
| @@ -43,7 +43,7 @@ Index of this file: | ||||
| //----------------------------------------------------------------------------- | ||||
|  | ||||
| #ifndef IMGUI_VERSION | ||||
| #error Must include imgui.h before imgui_internal.h | ||||
| #include "imgui.h" | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h>      // FILE*, sscanf | ||||
| @@ -1960,7 +1960,7 @@ struct ImGuiContext | ||||
|  | ||||
|         LastValidMousePos = ImVec2(0.0f, 0.0f); | ||||
|         TempInputId = 0; | ||||
|         ColorEditOptions = ImGuiColorEditFlags__OptionsDefault; | ||||
|         ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; | ||||
|         ColorEditLastHue = ColorEditLastSat = 0.0f; | ||||
|         ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX; | ||||
|         SliderCurrentAccum = 0.0f; | ||||
|   | ||||
| @@ -4786,24 +4786,24 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|     // If we're not showing any slider there's no point in doing any HSV conversions | ||||
|     const ImGuiColorEditFlags flags_untouched = flags; | ||||
|     if (flags & ImGuiColorEditFlags_NoInputs) | ||||
|         flags = (flags & (~ImGuiColorEditFlags__DisplayMask)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions; | ||||
|         flags = (flags & (~ImGuiColorEditFlags_DisplayMask_)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions; | ||||
|  | ||||
|     // Context menu: display and modify options (before defaults are applied) | ||||
|     if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||
|         ColorEditOptionsPopup(col, flags); | ||||
|  | ||||
|     // Read stored options | ||||
|     if (!(flags & ImGuiColorEditFlags__DisplayMask)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DisplayMask); | ||||
|     if (!(flags & ImGuiColorEditFlags__DataTypeMask)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DataTypeMask); | ||||
|     if (!(flags & ImGuiColorEditFlags__PickerMask)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags__PickerMask); | ||||
|     if (!(flags & ImGuiColorEditFlags__InputMask)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags__InputMask); | ||||
|     flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags__DisplayMask | ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask)); | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DisplayMask)); // Check that only 1 is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask));   // Check that only 1 is selected | ||||
|     if (!(flags & ImGuiColorEditFlags_DisplayMask_)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DisplayMask_); | ||||
|     if (!(flags & ImGuiColorEditFlags_DataTypeMask_)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DataTypeMask_); | ||||
|     if (!(flags & ImGuiColorEditFlags_PickerMask_)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_); | ||||
|     if (!(flags & ImGuiColorEditFlags_InputMask_)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags_InputMask_); | ||||
|     flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_)); | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check that only 1 is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_));   // Check that only 1 is selected | ||||
|  | ||||
|     const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; | ||||
|     const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; | ||||
| @@ -4932,8 +4932,8 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag | ||||
|                 TextEx(label, label_display_end); | ||||
|                 Spacing(); | ||||
|             } | ||||
|             ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; | ||||
|             ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__DisplayMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; | ||||
|             ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; | ||||
|             ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; | ||||
|             SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? | ||||
|             value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); | ||||
|             EndPopup(); | ||||
| @@ -5053,12 +5053,12 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|         ColorPickerOptionsPopup(col, flags); | ||||
|  | ||||
|     // Read stored options | ||||
|     if (!(flags & ImGuiColorEditFlags__PickerMask)) | ||||
|         flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__PickerMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__PickerMask; | ||||
|     if (!(flags & ImGuiColorEditFlags__InputMask)) | ||||
|         flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__InputMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__InputMask; | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__PickerMask)); // Check that only 1 is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask));  // Check that only 1 is selected | ||||
|     if (!(flags & ImGuiColorEditFlags_PickerMask_)) | ||||
|         flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_PickerMask_; | ||||
|     if (!(flags & ImGuiColorEditFlags_InputMask_)) | ||||
|         flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_InputMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_InputMask_; | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check that only 1 is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_));  // Check that only 1 is selected | ||||
|     if (!(flags & ImGuiColorEditFlags_NoOptions)) | ||||
|         flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar); | ||||
|  | ||||
| @@ -5204,7 +5204,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|         if ((flags & ImGuiColorEditFlags_NoLabel)) | ||||
|             Text("Current"); | ||||
|  | ||||
|         ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip; | ||||
|         ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip; | ||||
|         ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2)); | ||||
|         if (ref_col != NULL) | ||||
|         { | ||||
| @@ -5243,9 +5243,9 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|     if ((flags & ImGuiColorEditFlags_NoInputs) == 0) | ||||
|     { | ||||
|         PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); | ||||
|         ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; | ||||
|         ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; | ||||
|         ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; | ||||
|         if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags__DisplayMask) == 0) | ||||
|         if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) | ||||
|             if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) | ||||
|             { | ||||
|                 // FIXME: Hackily differentiating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. | ||||
| @@ -5253,9 +5253,9 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|                 value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap); | ||||
|                 value_changed = true; | ||||
|             } | ||||
|         if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags__DisplayMask) == 0) | ||||
|         if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) | ||||
|             value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_DisplayHSV); | ||||
|         if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags__DisplayMask) == 0) | ||||
|         if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) | ||||
|             value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_DisplayHex); | ||||
|         PopItemWidth(); | ||||
|     } | ||||
| @@ -5485,7 +5485,7 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl | ||||
|  | ||||
|     // Tooltip | ||||
|     if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) | ||||
|         ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); | ||||
|         ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); | ||||
|  | ||||
|     return pressed; | ||||
| } | ||||
| @@ -5494,18 +5494,18 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl | ||||
| void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags) | ||||
| { | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     if ((flags & ImGuiColorEditFlags__DisplayMask) == 0) | ||||
|         flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DisplayMask; | ||||
|     if ((flags & ImGuiColorEditFlags__DataTypeMask) == 0) | ||||
|         flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DataTypeMask; | ||||
|     if ((flags & ImGuiColorEditFlags__PickerMask) == 0) | ||||
|         flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__PickerMask; | ||||
|     if ((flags & ImGuiColorEditFlags__InputMask) == 0) | ||||
|         flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__InputMask; | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DisplayMask));    // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DataTypeMask));   // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__PickerMask));     // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask));      // Check only 1 option is selected | ||||
|     if ((flags & ImGuiColorEditFlags_DisplayMask_) == 0) | ||||
|         flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DisplayMask_; | ||||
|     if ((flags & ImGuiColorEditFlags_DataTypeMask_) == 0) | ||||
|         flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DataTypeMask_; | ||||
|     if ((flags & ImGuiColorEditFlags_PickerMask_) == 0) | ||||
|         flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_PickerMask_; | ||||
|     if ((flags & ImGuiColorEditFlags_InputMask_) == 0) | ||||
|         flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_InputMask_; | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_));    // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DataTypeMask_));   // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_));     // Check only 1 option is selected | ||||
|     IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_));      // Check only 1 option is selected | ||||
|     g.ColorEditOptions = flags; | ||||
| } | ||||
|  | ||||
| @@ -5525,9 +5525,9 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags | ||||
|     ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2); | ||||
|     ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); | ||||
|     int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); | ||||
|     ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); | ||||
|     ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); | ||||
|     SameLine(); | ||||
|     if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags__InputMask)) | ||||
|     if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags_InputMask_)) | ||||
|     { | ||||
|         if (flags & ImGuiColorEditFlags_NoAlpha) | ||||
|             Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]); | ||||
| @@ -5546,23 +5546,23 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags | ||||
|  | ||||
| void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) | ||||
| { | ||||
|     bool allow_opt_inputs = !(flags & ImGuiColorEditFlags__DisplayMask); | ||||
|     bool allow_opt_datatype = !(flags & ImGuiColorEditFlags__DataTypeMask); | ||||
|     bool allow_opt_inputs = !(flags & ImGuiColorEditFlags_DisplayMask_); | ||||
|     bool allow_opt_datatype = !(flags & ImGuiColorEditFlags_DataTypeMask_); | ||||
|     if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) | ||||
|         return; | ||||
|     ImGuiContext& g = *GImGui; | ||||
|     ImGuiColorEditFlags opts = g.ColorEditOptions; | ||||
|     if (allow_opt_inputs) | ||||
|     { | ||||
|         if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayRGB; | ||||
|         if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayHSV; | ||||
|         if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayHex; | ||||
|         if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayRGB; | ||||
|         if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHSV; | ||||
|         if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHex; | ||||
|     } | ||||
|     if (allow_opt_datatype) | ||||
|     { | ||||
|         if (allow_opt_inputs) Separator(); | ||||
|         if (RadioButton("0..255",     (opts & ImGuiColorEditFlags_Uint8) != 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Uint8; | ||||
|         if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) != 0)) opts = (opts & ~ImGuiColorEditFlags__DataTypeMask) | ImGuiColorEditFlags_Float; | ||||
|         if (RadioButton("0..255",     (opts & ImGuiColorEditFlags_Uint8) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Uint8; | ||||
|         if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Float; | ||||
|     } | ||||
|  | ||||
|     if (allow_opt_inputs || allow_opt_datatype) | ||||
| @@ -5597,7 +5597,7 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) | ||||
|  | ||||
| void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) | ||||
| { | ||||
|     bool allow_opt_picker = !(flags & ImGuiColorEditFlags__PickerMask); | ||||
|     bool allow_opt_picker = !(flags & ImGuiColorEditFlags_PickerMask_); | ||||
|     bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar); | ||||
|     if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) | ||||
|         return; | ||||
| @@ -5616,7 +5616,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl | ||||
|             if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; | ||||
|             ImVec2 backup_pos = GetCursorScreenPos(); | ||||
|             if (Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup | ||||
|                 g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags__PickerMask) | (picker_flags & ImGuiColorEditFlags__PickerMask); | ||||
|                 g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags_PickerMask_) | (picker_flags & ImGuiColorEditFlags_PickerMask_); | ||||
|             SetCursorScreenPos(backup_pos); | ||||
|             ImVec4 previewing_ref_col; | ||||
|             memcpy(&previewing_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user