Skip to content

Commit af7fa51

Browse files
committed
Canvas: Use ImDrawCallback_ImCanvas macro as draw callback sentinel (#256)
1 parent 8afc83b commit af7fa51

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

docs/CHANGELOG.txt

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
v0.9.3 (WIP):
22

3+
CHANGE: Canvas: Use ImDrawCallback_ImCanvas macro as draw callback sentinel (#256), thanks @nspitko
4+
35
BUGFIX: Canvas: Ensure SentinelDrawCallback cleanup (#255)
46

57
BUGFIX: Editor: Don't call Reasume/Suspend on invisible canvas (#255)

imgui_canvas.cpp

+8-9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
static constexpr bool value = (sizeof(yes_type) == sizeof(test<mixin>(0))); \
2828
}
2929

30+
// Special sentinel value. This needs to be unique, so allow it to be overridden in the user's ImGui config
31+
# ifndef ImDrawCallback_ImCanvas
32+
# define ImDrawCallback_ImCanvas (ImDrawCallback)(-2)
33+
# endif
34+
3035
namespace ImCanvasDetails {
3136

3237
DECLARE_HAS_MEMBER(HasFringeScale, _FringeScale);
@@ -68,12 +73,6 @@ struct VtxCurrentOffsetRef
6873
}
6974
};
7075

71-
static void SentinelDrawCallback(const ImDrawList* parent_list, const ImDrawCmd* cmd)
72-
{
73-
// This is a sentinel draw callback, it's only purpose is to mark draw list command.
74-
IM_ASSERT(false && "This draw callback should never be called.");
75-
}
76-
7776
} // namespace ImCanvasDetails
7877

7978
// Returns a reference to _FringeScale extension to ImDrawList
@@ -444,7 +443,7 @@ void ImGuiEx::Canvas::EnterLocalSpace()
444443
//
445444
// More investigation is needed. To get to the bottom of this.
446445
if ((!m_DrawList->CmdBuffer.empty() && m_DrawList->CmdBuffer.back().ElemCount > 0) || m_DrawList->_Splitter._Count > 1)
447-
m_DrawList->AddCallback(&ImCanvasDetails::SentinelDrawCallback, nullptr);
446+
m_DrawList->AddCallback(ImDrawCallback_ImCanvas, nullptr);
448447

449448
# if defined(IMGUI_HAS_VIEWPORT)
450449
auto window = ImGui::GetCurrentWindow();
@@ -556,9 +555,9 @@ void ImGuiEx::Canvas::LeaveLocalSpace()
556555
// Remove sentinel draw command if present
557556
if (m_DrawListCommadBufferSize > 0)
558557
{
559-
if (m_DrawList->CmdBuffer.size() > m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize].UserCallback == &ImCanvasDetails::SentinelDrawCallback)
558+
if (m_DrawList->CmdBuffer.size() > m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize].UserCallback == ImDrawCallback_ImCanvas)
560559
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize);
561-
else if (m_DrawList->CmdBuffer.size() >= m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize - 1].UserCallback == &ImCanvasDetails::SentinelDrawCallback)
560+
else if (m_DrawList->CmdBuffer.size() >= m_DrawListCommadBufferSize && m_DrawList->CmdBuffer[m_DrawListCommadBufferSize - 1].UserCallback == ImDrawCallback_ImCanvas)
562561
m_DrawList->CmdBuffer.erase(m_DrawList->CmdBuffer.Data + m_DrawListCommadBufferSize - 1);
563562
}
564563

0 commit comments

Comments
 (0)