Skip to content

Commit 0d3f880

Browse files
committed
Added a void* user_data parameter to Clipboard function handlers. (ocornut#875)
1 parent d649bc4 commit 0d3f880

File tree

10 files changed

+54
-46
lines changed

10 files changed

+54
-46
lines changed

examples/allegro5_example/imgui_impl_a5.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
// ImGui Allegro 5 bindings
22
// In this binding, ImTextureID is used to store a 'ALLEGRO_BITMAP*' texture identifier. Read the FAQ about ImTextureID in imgui.cpp.
33

4+
// TODO:
5+
// - Clipboard is not supported.
6+
47
// You can copy and use unmodified imgui_impl_* files in your project. See main.cpp for an example of using this.
58
// If you use this binding you'll need to call 4 functions: ImGui_ImplXXXX_Init(), ImGui_ImplXXXX_NewFrame(), ImGui::Render() and ImGui_ImplXXXX_Shutdown().
69
// If you are new to ImGui, see examples/README.txt and documentation at the top of imgui.cpp.

examples/apple_example/imguiex-ios/imgui_impl_ios.mm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
// Providing a standalone iOS application with Synergy integration makes this sample more verbose than others. It also hasn't been tested as much.
44
// Refer to other examples to get an easier understanding of how to integrate ImGui into your existing application.
55

6+
// TODO:
7+
// - Clipboard is not supported.
8+
69
#import <OpenGLES/ES3/gl.h>
710
#import <OpenGLES/ES3/glext.h>
811

@@ -288,7 +291,6 @@ void ImGui_ClipboardCallback(uSynergyCookie cookie, enum uSynergyClipboardFormat
288291
printf("Synergy: clipboard callback TODO\n" );
289292
}
290293

291-
292294
@interface ImGuiHelper ()
293295
{
294296
BOOL _mouseDown;

examples/marmalade_example/imgui_impl_marmalade.cpp

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,28 +89,24 @@ void ImGui_Marmalade_RenderDrawLists(ImDrawData* draw_data)
8989
// TODO: restore modified state (i.e. mvp matrix)
9090
}
9191

92-
static const char* ImGui_Marmalade_GetClipboardText()
92+
static const char* ImGui_Marmalade_GetClipboardText(void* /*user_data*/)
9393
{
94-
if (s3eClipboardAvailable())
94+
if (!s3eClipboardAvailable())
95+
return NULL;
96+
97+
if (int size = s3eClipboardGetText(NULL, 0))
9598
{
96-
int size = s3eClipboardGetText(NULL, 0);
97-
if (size > 0)
98-
{
99-
if (g_ClipboardText)
100-
{
101-
delete[] g_ClipboardText;
102-
g_ClipboardText = NULL;
103-
}
104-
g_ClipboardText = new char[size];
105-
g_ClipboardText[0] = '\0';
106-
s3eClipboardGetText(g_ClipboardText, size);
107-
}
99+
if (g_ClipboardText)
100+
delete[] g_ClipboardText;
101+
g_ClipboardText = new char[size];
102+
g_ClipboardText[0] = '\0';
103+
s3eClipboardGetText(g_ClipboardText, size);
108104
}
109105

110106
return g_ClipboardText;
111107
}
112108

113-
static void ImGui_Marmalade_SetClipboardText(const char* text)
109+
static void ImGui_Marmalade_SetClipboardText(void* /*user_data*/, const char* text)
114110
{
115111
if (s3eClipboardAvailable())
116112
s3eClipboardSetText(text);

examples/opengl2_example/imgui_impl_glfw.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,14 @@ void ImGui_ImplGlfw_RenderDrawLists(ImDrawData* draw_data)
112112
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
113113
}
114114

115-
static const char* ImGui_ImplGlfw_GetClipboardText()
115+
static const char* ImGui_ImplGlfw_GetClipboardText(void* user_data)
116116
{
117-
return glfwGetClipboardString(g_Window);
117+
return glfwGetClipboardString((GLFWwindow*)user_data);
118118
}
119119

120-
static void ImGui_ImplGlfw_SetClipboardText(const char* text)
120+
static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text)
121121
{
122-
glfwSetClipboardString(g_Window, text);
122+
glfwSetClipboardString((GLFWwindow*)user_data, text);
123123
}
124124

125125
void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
@@ -219,6 +219,7 @@ bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks)
219219
io.RenderDrawListsFn = ImGui_ImplGlfw_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
220220
io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
221221
io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText;
222+
io.ClipboardUserData = g_Window;
222223
#ifdef _WIN32
223224
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
224225
#endif

examples/opengl3_example/imgui_impl_glfw_gl3.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,14 @@ void ImGui_ImplGlfwGL3_RenderDrawLists(ImDrawData* draw_data)
129129
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
130130
}
131131

132-
static const char* ImGui_ImplGlfwGL3_GetClipboardText()
132+
static const char* ImGui_ImplGlfwGL3_GetClipboardText(void* user_data)
133133
{
134-
return glfwGetClipboardString(g_Window);
134+
return glfwGetClipboardString((GLFWwindow*)user_data);
135135
}
136136

137-
static void ImGui_ImplGlfwGL3_SetClipboardText(const char* text)
137+
static void ImGui_ImplGlfwGL3_SetClipboardText(void* user_data, const char* text)
138138
{
139-
glfwSetClipboardString(g_Window, text);
139+
glfwSetClipboardString((GLFWwindow*)user_data, text);
140140
}
141141

142142
void ImGui_ImplGlfwGL3_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
@@ -329,6 +329,7 @@ bool ImGui_ImplGlfwGL3_Init(GLFWwindow* window, bool install_callbacks)
329329
io.RenderDrawListsFn = ImGui_ImplGlfwGL3_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
330330
io.SetClipboardTextFn = ImGui_ImplGlfwGL3_SetClipboardText;
331331
io.GetClipboardTextFn = ImGui_ImplGlfwGL3_GetClipboardText;
332+
io.ClipboardUserData = g_Window;
332333
#ifdef _WIN32
333334
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
334335
#endif

examples/sdl_opengl2_example/imgui_impl_sdl.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,12 +101,12 @@ void ImGui_ImplSdl_RenderDrawLists(ImDrawData* draw_data)
101101
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
102102
}
103103

104-
static const char* ImGui_ImplSdl_GetClipboardText()
104+
static const char* ImGui_ImplSdl_GetClipboardText(void*)
105105
{
106106
return SDL_GetClipboardText();
107107
}
108108

109-
static void ImGui_ImplSdl_SetClipboardText(const char* text)
109+
static void ImGui_ImplSdl_SetClipboardText(void*, const char* text)
110110
{
111111
SDL_SetClipboardText(text);
112112
}
@@ -214,6 +214,7 @@ bool ImGui_ImplSdl_Init(SDL_Window* window)
214214
io.RenderDrawListsFn = ImGui_ImplSdl_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
215215
io.SetClipboardTextFn = ImGui_ImplSdl_SetClipboardText;
216216
io.GetClipboardTextFn = ImGui_ImplSdl_GetClipboardText;
217+
io.ClipboardUserData = NULL;
217218

218219
#ifdef _WIN32
219220
SDL_SysWMinfo wmInfo;

examples/sdl_opengl3_example/imgui_impl_sdl_gl3.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,12 @@ void ImGui_ImplSdlGL3_RenderDrawLists(ImDrawData* draw_data)
123123
glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
124124
}
125125

126-
static const char* ImGui_ImplSdlGL3_GetClipboardText()
126+
static const char* ImGui_ImplSdlGL3_GetClipboardText(void*)
127127
{
128128
return SDL_GetClipboardText();
129129
}
130130

131-
static void ImGui_ImplSdlGL3_SetClipboardText(const char* text)
131+
static void ImGui_ImplSdlGL3_SetClipboardText(void*, const char* text)
132132
{
133133
SDL_SetClipboardText(text);
134134
}
@@ -327,6 +327,7 @@ bool ImGui_ImplSdlGL3_Init(SDL_Window* window)
327327
io.RenderDrawListsFn = ImGui_ImplSdlGL3_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
328328
io.SetClipboardTextFn = ImGui_ImplSdlGL3_SetClipboardText;
329329
io.GetClipboardTextFn = ImGui_ImplSdlGL3_GetClipboardText;
330+
io.ClipboardUserData = NULL;
330331

331332
#ifdef _WIN32
332333
SDL_SysWMinfo wmInfo;

examples/vulkan_example/imgui_impl_glfw_vulkan.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,14 +401,14 @@ void ImGui_ImplGlfwVulkan_RenderDrawLists(ImDrawData* draw_data)
401401
}
402402
}
403403

404-
static const char* ImGui_ImplGlfwVulkan_GetClipboardText()
404+
static const char* ImGui_ImplGlfwVulkan_GetClipboardText(void* user_data)
405405
{
406-
return glfwGetClipboardString(g_Window);
406+
return glfwGetClipboardString((GLFWwindow*)user_data);
407407
}
408408

409-
static void ImGui_ImplGlfwVulkan_SetClipboardText(const char* text)
409+
static void ImGui_ImplGlfwVulkan_SetClipboardText(void* user_data, const char* text)
410410
{
411-
glfwSetClipboardString(g_Window, text);
411+
glfwSetClipboardString((GLFWwindow*)user_data, text);
412412
}
413413

414414
void ImGui_ImplGlfwVulkan_MouseButtonCallback(GLFWwindow*, int button, int action, int /*mods*/)
@@ -861,6 +861,7 @@ bool ImGui_ImplGlfwVulkan_Init(GLFWwindow* window, bool install_callbacks, Im
861861
io.RenderDrawListsFn = ImGui_ImplGlfwVulkan_RenderDrawLists; // Alternatively you can set this to NULL and call ImGui::GetDrawData() after ImGui::Render() to get the same ImDrawData pointer.
862862
io.SetClipboardTextFn = ImGui_ImplGlfwVulkan_SetClipboardText;
863863
io.GetClipboardTextFn = ImGui_ImplGlfwVulkan_GetClipboardText;
864+
io.ClipboardUserData = g_Window;
864865
#ifdef _WIN32
865866
io.ImeWindowHandle = glfwGetWin32Window(g_Window);
866867
#endif

imgui.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
Here is a change-log of API breaking changes, if you are using one of the functions listed, expect to have to fix some code.
151151
Also read releases logs https://github.com/ocornut/imgui/releases for more details.
152152
153+
- 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it.
153154
- 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc.
154155
- 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal.
155156
- 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore.
@@ -703,8 +704,8 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* ini
703704
// Platform dependent default implementations
704705
//-----------------------------------------------------------------------------
705706

706-
static const char* GetClipboardTextFn_DefaultImpl();
707-
static void SetClipboardTextFn_DefaultImpl(const char* text);
707+
static const char* GetClipboardTextFn_DefaultImpl(void* user_data);
708+
static void SetClipboardTextFn_DefaultImpl(void* user_data, const char* text);
708709
static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y);
709710

710711
//-----------------------------------------------------------------------------
@@ -829,6 +830,7 @@ ImGuiIO::ImGuiIO()
829830
MemFreeFn = free;
830831
GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations
831832
SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;
833+
ClipboardUserData = NULL;
832834
ImeSetInputScreenPosFn = ImeSetInputScreenPosFn_DefaultImpl;
833835

834836
// Set OS X style defaults based on __APPLE__ compile time flag
@@ -2010,13 +2012,13 @@ void ImGui::MemFree(void* ptr)
20102012

20112013
const char* ImGui::GetClipboardText()
20122014
{
2013-
return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn() : "";
2015+
return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn(GImGui->IO.ClipboardUserData) : "";
20142016
}
20152017

20162018
void ImGui::SetClipboardText(const char* text)
20172019
{
20182020
if (GImGui->IO.SetClipboardTextFn)
2019-
GImGui->IO.SetClipboardTextFn(text);
2021+
GImGui->IO.SetClipboardTextFn(GImGui->IO.ClipboardUserData, text);
20202022
}
20212023

20222024
const char* ImGui::GetVersion()
@@ -5796,8 +5798,7 @@ void ImGui::LogFinish()
57965798
}
57975799
if (g.LogClipboard->size() > 1)
57985800
{
5799-
if (g.IO.SetClipboardTextFn)
5800-
g.IO.SetClipboardTextFn(g.LogClipboard->begin());
5801+
SetClipboardText(g.LogClipboard->begin());
58015802
g.LogClipboard->clear();
58025803
}
58035804
}
@@ -7859,7 +7860,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
78597860
const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW;
78607861
edit_state.TempTextBuffer.resize((ie-ib) * 4 + 1);
78617862
ImTextStrToUtf8(edit_state.TempTextBuffer.Data, edit_state.TempTextBuffer.Size, edit_state.Text.Data+ib, edit_state.Text.Data+ie);
7862-
io.SetClipboardTextFn(edit_state.TempTextBuffer.Data);
7863+
SetClipboardText(edit_state.TempTextBuffer.Data);
78637864
}
78647865

78657866
if (cut)
@@ -7871,7 +7872,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
78717872
else if (is_shortcut_key_only && IsKeyPressedMap(ImGuiKey_V) && is_editable)
78727873
{
78737874
// Paste
7874-
if (const char* clipboard = io.GetClipboardTextFn ? io.GetClipboardTextFn() : NULL)
7875+
if (const char* clipboard = GetClipboardText())
78757876
{
78767877
// Filter pasted buffer
78777878
const int clipboard_len = (int)strlen(clipboard);
@@ -9565,7 +9566,7 @@ void ImGui::ValueColor(const char* prefix, ImU32 v)
95659566
#pragma comment(lib, "user32")
95669567
#endif
95679568

9568-
static const char* GetClipboardTextFn_DefaultImpl()
9569+
static const char* GetClipboardTextFn_DefaultImpl(void*)
95699570
{
95709571
static ImVector<char> buf_local;
95719572
buf_local.clear();
@@ -9585,7 +9586,7 @@ static const char* GetClipboardTextFn_DefaultImpl()
95859586
return buf_local.Data;
95869587
}
95879588

9588-
static void SetClipboardTextFn_DefaultImpl(const char* text)
9589+
static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
95899590
{
95909591
if (!OpenClipboard(NULL))
95919592
return;
@@ -9604,13 +9605,13 @@ static void SetClipboardTextFn_DefaultImpl(const char* text)
96049605
#else
96059606

96069607
// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
9607-
static const char* GetClipboardTextFn_DefaultImpl()
9608+
static const char* GetClipboardTextFn_DefaultImpl(void*)
96089609
{
96099610
return GImGui->PrivateClipboard;
96109611
}
96119612

96129613
// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
9613-
static void SetClipboardTextFn_DefaultImpl(const char* text)
9614+
static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
96149615
{
96159616
ImGuiContext& g = *GImGui;
96169617
if (g.PrivateClipboard)

imgui.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -757,8 +757,9 @@ struct ImGuiIO
757757

758758
// Optional: access OS clipboard
759759
// (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
760-
const char* (*GetClipboardTextFn)();
761-
void (*SetClipboardTextFn)(const char* text);
760+
const char* (*GetClipboardTextFn)(void* user_data);
761+
void (*SetClipboardTextFn)(void* user_data, const char* text);
762+
void* ClipboardUserData;
762763

763764
// Optional: override memory allocations. MemFreeFn() may be called with a NULL pointer.
764765
// (default to posix malloc/free)

0 commit comments

Comments
 (0)