IO: moved fields to put more focus on the new functions + update misc docs/references + update main.mm in Apple+Metal example (#4858)
This commit is contained in:
parent
90a6961638
commit
673f5e588d
@ -222,7 +222,7 @@ If you are interested in using Cmake to build and links examples, see:
|
|||||||
**About mouse cursor latency**
|
**About mouse cursor latency**
|
||||||
|
|
||||||
Dear ImGui has no particular extra lag for most behaviors,
|
Dear ImGui has no particular extra lag for most behaviors,
|
||||||
e.g. the value of 'io.MousePos' provided at the time of NewFrame() will result in windows being moved
|
e.g. the last value passed to 'io.AddMousePosEvent()' before NewFrame() will result in windows being moved
|
||||||
to the right spot at the time of EndFrame()/Render(). At 60 FPS your experience should be pleasant.
|
to the right spot at the time of EndFrame()/Render(). At 60 FPS your experience should be pleasant.
|
||||||
|
|
||||||
However, consider that OS mouse cursors are typically drawn through a very specific hardware accelerated
|
However, consider that OS mouse cursors are typically drawn through a very specific hardware accelerated
|
||||||
|
@ -114,7 +114,7 @@ void MyLowLevelMouseButtonHandler(int button, bool down)
|
|||||||
{
|
{
|
||||||
// (1) ALWAYS forward mouse data to ImGui! This is automatic with default backends. With your own backend:
|
// (1) ALWAYS forward mouse data to ImGui! This is automatic with default backends. With your own backend:
|
||||||
ImGuiIO& io = ImGui::GetIO();
|
ImGuiIO& io = ImGui::GetIO();
|
||||||
io.MouseDown[button] = down;
|
io.AddMouseButtonEvent(button, down);
|
||||||
|
|
||||||
// (2) ONLY forward mouse data to your underlying app/game.
|
// (2) ONLY forward mouse data to your underlying app/game.
|
||||||
if (!io.WantCaptureMouse)
|
if (!io.WantCaptureMouse)
|
||||||
|
@ -238,7 +238,7 @@
|
|||||||
UITouch *anyTouch = event.allTouches.anyObject;
|
UITouch *anyTouch = event.allTouches.anyObject;
|
||||||
CGPoint touchLocation = [anyTouch locationInView:self.view];
|
CGPoint touchLocation = [anyTouch locationInView:self.view];
|
||||||
ImGuiIO &io = ImGui::GetIO();
|
ImGuiIO &io = ImGui::GetIO();
|
||||||
io.MousePos = ImVec2(touchLocation.x, touchLocation.y);
|
io.AddMousePosEvent(touchLocation.x, touchLocation.y);
|
||||||
|
|
||||||
BOOL hasActiveTouch = NO;
|
BOOL hasActiveTouch = NO;
|
||||||
for (UITouch *touch in event.allTouches)
|
for (UITouch *touch in event.allTouches)
|
||||||
@ -249,7 +249,7 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
io.MouseDown[0] = hasActiveTouch;
|
io.AddMouseButtonEvent(0, hasActiveTouch);
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
|
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; }
|
||||||
|
40
imgui.cpp
40
imgui.cpp
@ -255,9 +255,9 @@ CODE
|
|||||||
io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds)
|
io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds)
|
||||||
io.DisplaySize.x = 1920.0f; // set the current display width
|
io.DisplaySize.x = 1920.0f; // set the current display width
|
||||||
io.DisplaySize.y = 1280.0f; // set the current display height here
|
io.DisplaySize.y = 1280.0f; // set the current display height here
|
||||||
io.MousePos = my_mouse_pos; // set the mouse position
|
io.AddMousePosEvent(mouse_x, mouse_y); // update mouse position
|
||||||
io.MouseDown[0] = my_mouse_buttons[0]; // set the mouse button states
|
io.AddMouseButtonEvent(0, mouse_b[0]); // update mouse button states
|
||||||
io.MouseDown[1] = my_mouse_buttons[1];
|
io.AddMouseButtonEvent(1, mouse_b[1]); // update mouse button states
|
||||||
|
|
||||||
// Call NewFrame(), after this point you can use ImGui::* functions anytime
|
// Call NewFrame(), after this point you can use ImGui::* functions anytime
|
||||||
// (So you want to try calling NewFrame() as early as you can in your main loop to be able to use Dear ImGui everywhere)
|
// (So you want to try calling NewFrame() as early as you can in your main loop to be able to use Dear ImGui everywhere)
|
||||||
@ -386,6 +386,11 @@ CODE
|
|||||||
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
|
||||||
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
|
||||||
|
|
||||||
|
- 2022/01/17 (1.87) - inputs: reworked mouse IO.
|
||||||
|
- Backend writing to io.MousePos -> backend should call io.AddMousePosEvent()
|
||||||
|
- Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent()
|
||||||
|
- Backend writing to io.MouseWheel -> backend should call io.AddMouseWheelEvent()
|
||||||
|
- Backend writing to io.MouseHoveredViewpot -> backend should call io.AddMouseViewportEvent() [Docking branch only]
|
||||||
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
- 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details.
|
||||||
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
- IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX)
|
||||||
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
- IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX)
|
||||||
@ -1325,6 +1330,21 @@ void ImGuiIO::AddMousePosEvent(float x, float y)
|
|||||||
g.InputEventsQueue.push_back(e);
|
g.InputEventsQueue.push_back(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down)
|
||||||
|
{
|
||||||
|
ImGuiContext& g = *GImGui;
|
||||||
|
IM_ASSERT(&g.IO == this && "Can only add events to current context.");
|
||||||
|
IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT);
|
||||||
|
|
||||||
|
ImGuiInputEvent e;
|
||||||
|
e.Type = ImGuiInputEventType_MouseButton;
|
||||||
|
e.Source = ImGuiInputSource_Mouse;
|
||||||
|
e.MouseButton.Button = mouse_button;
|
||||||
|
e.MouseButton.Down = down;
|
||||||
|
g.InputEventsQueue.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Queue a mouse wheel event (most mouse/API will only have a Y component)
|
||||||
void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y)
|
void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
@ -1340,20 +1360,6 @@ void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y)
|
|||||||
g.InputEventsQueue.push_back(e);
|
g.InputEventsQueue.push_back(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down)
|
|
||||||
{
|
|
||||||
ImGuiContext& g = *GImGui;
|
|
||||||
IM_ASSERT(&g.IO == this && "Can only add events to current context.");
|
|
||||||
IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT);
|
|
||||||
|
|
||||||
ImGuiInputEvent e;
|
|
||||||
e.Type = ImGuiInputEventType_MouseButton;
|
|
||||||
e.Source = ImGuiInputSource_Mouse;
|
|
||||||
e.MouseButton.Button = mouse_button;
|
|
||||||
e.MouseButton.Down = down;
|
|
||||||
g.InputEventsQueue.push_back(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ImGuiIO::AddFocusEvent(bool focused)
|
void ImGuiIO::AddFocusEvent(bool focused)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
|
35
imgui.h
35
imgui.h
@ -1979,29 +1979,19 @@ struct ImGuiIO
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
// Input - Fill before calling NewFrame()
|
// Input - Call before calling NewFrame()
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.)
|
|
||||||
bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
|
|
||||||
float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text.
|
|
||||||
float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all backends.
|
|
||||||
bool KeyCtrl; // Keyboard modifier down: Control
|
|
||||||
bool KeyShift; // Keyboard modifier down: Shift
|
|
||||||
bool KeyAlt; // Keyboard modifier down: Alt
|
|
||||||
bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows
|
|
||||||
float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame().
|
|
||||||
|
|
||||||
// Input Functions
|
// Input Functions
|
||||||
IMGUI_API void AddKeyEvent(ImGuiKey key, bool down); // Queue a new key down/up event. Key should be "translated" (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character)
|
IMGUI_API void AddKeyEvent(ImGuiKey key, bool down); // Queue a new key down/up event. Key should be "translated" (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character)
|
||||||
IMGUI_API void AddKeyModsEvent(ImGuiKeyModFlags modifiers);// Queue a change of Ctrl/Shift/Alt/Super modifiers
|
IMGUI_API void AddKeyModsEvent(ImGuiKeyModFlags modifiers);// Queue a change of Ctrl/Shift/Alt/Super modifiers
|
||||||
IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered)
|
IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered)
|
||||||
IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change
|
IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change
|
||||||
IMGUI_API void AddMouseWheelEvent(float wh_x, float wh_y); // Queue a mouse wheel update
|
IMGUI_API void AddMouseWheelEvent(float wh_x, float wh_y); // Queue a mouse wheel update
|
||||||
IMGUI_API void AddFocusEvent(bool focused); // Queue an hosting application/platform windows gain or loss of focus
|
IMGUI_API void AddFocusEvent(bool focused); // Queue a gain/loss of focus for the application (generally based on OS/platform focus of your window)
|
||||||
IMGUI_API void AddInputCharacter(unsigned int c); // Queue new character input
|
IMGUI_API void AddInputCharacter(unsigned int c); // Queue a new character input
|
||||||
IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue new character input from an UTF-16 character, it can be a surrogate
|
IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue a new character input from an UTF-16 character, it can be a surrogate
|
||||||
IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue new characters input from an UTF-8 string
|
IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue a new characters input from an UTF-8 string
|
||||||
|
|
||||||
IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually
|
IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually
|
||||||
IMGUI_API void ClearInputKeys(); // [Internal] Release all keys
|
IMGUI_API void ClearInputKeys(); // [Internal] Release all keys
|
||||||
@ -2039,10 +2029,23 @@ struct ImGuiIO
|
|||||||
// [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed!
|
// [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed!
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Main Input State
|
||||||
|
// (this block used to be written by backend, since 1.87 it is best to NOT write to those directly, call the AddXXX functions above instead)
|
||||||
|
// (reading from those variables is fair game, as they are extremely unlikely to be moving anywhere)
|
||||||
|
ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.)
|
||||||
|
bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Others buttons allows us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API.
|
||||||
|
float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text.
|
||||||
|
float MouseWheelH; // Mouse wheel Horizontal. Most users don't have a mouse with an horizontal wheel, may not be filled by all backends.
|
||||||
|
bool KeyCtrl; // Keyboard modifier down: Control
|
||||||
|
bool KeyShift; // Keyboard modifier down: Shift
|
||||||
|
bool KeyAlt; // Keyboard modifier down: Alt
|
||||||
|
bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows
|
||||||
|
float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame().
|
||||||
|
|
||||||
|
// Other state maintained from data above + IO function calls
|
||||||
ImGuiKeyModFlags KeyMods; // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame()
|
ImGuiKeyModFlags KeyMods; // Key mods flags (same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags), updated by NewFrame()
|
||||||
ImGuiKeyModFlags KeyModsPrev; // Key mods flags (from previous frame)
|
ImGuiKeyModFlags KeyModsPrev; // Key mods flags (from previous frame)
|
||||||
ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this.
|
ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this.
|
||||||
|
|
||||||
bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup.
|
bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup.
|
||||||
ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid)
|
ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid)
|
||||||
ImVec2 MouseClickedPos[5]; // Position at time of clicking
|
ImVec2 MouseClickedPos[5]; // Position at time of clicking
|
||||||
|
Loading…
Reference in New Issue
Block a user