Default "local only" clipboard handler on non-Windows platforms
diff --git a/imconfig.h b/imconfig.h
index 4f1deac..98b16f1 100644
--- a/imconfig.h
+++ b/imconfig.h
@@ -13,7 +13,7 @@
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//---- Don't implement default clipboard handlers for Windows (so as not to link with OpenClipboard(), etc.)
-//#define IMGUI_DONT_IMPLEMENT_WINDOWS_CLIPBOARD_FUNCTIONS
+//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS
//---- If you are loading a custom font, ImGui expect to find a pure white pixel at (0,0)
// Change it's UV coordinate here if you can't have a white pixel at (0,0)
diff --git a/imgui.cpp b/imgui.cpp
index 6800dcb..7ad8be8 100644
--- a/imgui.cpp
+++ b/imgui.cpp
@@ -146,7 +146,6 @@
- filters: handle wildcards (with implicit leading/trailing *), regexps
- shortcuts: add a shortcut api, e.g. parse "&Save" and/or "Save (CTRL+S)", pass in to widgets or provide simple ways to use (button=activate, input=focus)
- keyboard: full keyboard navigation and focus
- - clipboard: add a default "local" implementation of clipboard functions (user will only need to override them to connect to OS clipboard)
- misc: not thread-safe
- optimisation/render: use indexed rendering
- optimisation/render: move clip-rect to vertex data? would allow merging all commands
@@ -154,8 +153,6 @@
- optimisation: turn some the various stack vectors into statically-sized arrays
- optimisation: better clipping for multi-component widgets
- optimisation: specialize for height based clipping first (assume widgets never go up + height tests before width tests?)
- - optimisation/portability: provide ImVector style implementation
- - optimisation/portability: remove dependency on <algorithm>
*/
#include "imgui.h"
@@ -198,15 +195,11 @@
}; // namespace ImGui
//-----------------------------------------------------------------------------
-// Platform dependant helpers
+// Platform dependant default implementations
//-----------------------------------------------------------------------------
-#ifdef _MSC_VER
-#ifndef IMGUI_DONT_IMPLEMENT_WINDOWS_CLIPBOARD_FUNCTIONS
-static const char* GetClipboardTextFn_DefaultImplWindows();
-static void SetClipboardTextFn_DefaultImplWindows(const char* text, const char* text_end);
-#endif
-#endif
+static const char* GetClipboardTextFn_DefaultImpl();
+static void SetClipboardTextFn_DefaultImpl(const char* text, const char* text_end);
//-----------------------------------------------------------------------------
// User facing structures
@@ -282,12 +275,8 @@
MouseDoubleClickMaxDist = 6.0f;
// Platform dependant default implementations
-#ifdef _MSC_VER
-#ifndef IMGUI_DONT_IMPLEMENT_WINDOWS_CLIPBOARD_FUNCTIONS
- GetClipboardTextFn = GetClipboardTextFn_DefaultImplWindows;
- SetClipboardTextFn = SetClipboardTextFn_DefaultImplWindows;
-#endif
-#endif
+ GetClipboardTextFn = GetClipboardTextFn_DefaultImpl;
+ SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;
}
// Pass in translated ASCII characters for text input.
@@ -630,6 +619,7 @@
ImGuiStorage ColorEditModeStorage; // for user selection
ImGuiID ActiveComboID;
char Tooltip[1024];
+ char* PrivateClipboard; // if no custom clipboard handler is defined
// Logging
bool LogEnabled;
@@ -653,6 +643,7 @@
SliderAsInputTextId = 0;
ActiveComboID = 0;
memset(Tooltip, 0, sizeof(Tooltip));
+ PrivateClipboard = NULL;
LogEnabled = false;
LogFile = NULL;
LogAutoExpandMaxDepth = 2;
@@ -1313,6 +1304,12 @@
g.IO.Font = NULL;
}
+ if (g.PrivateClipboard)
+ {
+ free(g.PrivateClipboard);
+ g.PrivateClipboard = NULL;
+ }
+
g.Initialized = false;
}
@@ -5201,13 +5198,13 @@
// PLATFORM DEPENDANT HELPERS
//-----------------------------------------------------------------------------
-#ifdef _MSC_VER
-#ifndef IMGUI_DONT_IMPLEMENT_WINDOWS_CLIPBOARD_FUNCTIONS
+#if defined(_MSC_VER) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS)
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
-static const char* GetClipboardTextFn_DefaultImplWindows()
+// Win32 API clipboard implementation
+static const char* GetClipboardTextFn_DefaultImpl()
{
static char* buf_local = NULL;
if (buf_local)
@@ -5215,47 +5212,62 @@
free(buf_local);
buf_local = NULL;
}
-
if (!OpenClipboard(NULL))
return NULL;
-
HANDLE buf_handle = GetClipboardData(CF_TEXT);
if (buf_handle == NULL)
return NULL;
-
if (char* buf_global = (char*)GlobalLock(buf_handle))
buf_local = strdup(buf_global);
GlobalUnlock(buf_handle);
CloseClipboard();
-
return buf_local;
}
-static void SetClipboardTextFn_DefaultImplWindows(const char* text, const char* text_end)
+// Win32 API clipboard implementation
+static void SetClipboardTextFn_DefaultImpl(const char* text, const char* text_end)
{
if (!OpenClipboard(NULL))
return;
-
if (!text_end)
text_end = text + strlen(text);
-
const int buf_length = (text_end - text) + 1;
HGLOBAL buf_handle = GlobalAlloc(GMEM_MOVEABLE, buf_length * sizeof(char));
if (buf_handle == NULL)
return;
-
char* buf_global = (char *)GlobalLock(buf_handle);
memcpy(buf_global, text, text_end - text);
buf_global[text_end - text] = 0;
GlobalUnlock(buf_handle);
-
EmptyClipboard();
SetClipboardData(CF_TEXT, buf_handle);
CloseClipboard();
}
-#endif // #ifndef IMGUI_DONT_IMPLEMENT_WINDOWS_CLIPBOARD_FUNCTIONS
-#endif // #ifdef _MSC_VER
+#else
+
+// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
+static const char* GetClipboardTextFn_DefaultImpl()
+{
+ return GImGui.PrivateClipboard;
+}
+
+// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
+static void SetClipboardTextFn_DefaultImpl(const char* text, const char* text_end)
+{
+ if (GImGui.PrivateClipboard)
+ {
+ free(GImGui.PrivateClipboard);
+ GImGui.PrivateClipboard = NULL;
+ }
+ if (!text_end)
+ text_end = text + strlen(text);
+ GImGui.PrivateClipboard = (char*)malloc(text_end - text + 1);
+ memcpy(GImGui.PrivateClipboard, text, text_end - text);
+ GImGui.PrivateClipboard[text_end - text] = 0;
+}
+
+#endif
//-----------------------------------------------------------------------------
// HELP
diff --git a/imgui.h b/imgui.h
index bd92ed5..b006330 100644
--- a/imgui.h
+++ b/imgui.h
@@ -384,10 +384,16 @@
bool FontAllowScaling; // = false // Set to allow scaling text with CTRL+Wheel.
float PixelCenterOffset; // = 0.5f // Set to 0.0f for DirectX <= 9, 0.5f for Direct3D >= 10 and OpenGL.
- // Settings - Functions (fill once)
- void (*RenderDrawListsFn)(ImDrawList** const draw_lists, int count); // Required
- const char* (*GetClipboardTextFn)(); // Required for clipboard support
- void (*SetClipboardTextFn)(const char* text, const char* text_end); // Required for clipboard support (nb- the string is *NOT* zero-terminated at 'text_end')
+ // Settings - Rendering function (REQUIRED)
+ // See example code if you are unsure of how to implement this.
+ void (*RenderDrawListsFn)(ImDrawList** const draw_lists, int count);
+
+ // Settings - Clipboard Support
+ // Override to provide your clipboard handlers.
+ // On Windows architecture, defaults to use the native Win32 clipboard, otherwise default to use a ImGui private clipboard.
+ // NB- for SetClipboardTextFn, the string is *NOT* zero-terminated at 'text_end'
+ const char* (*GetClipboardTextFn)();
+ void (*SetClipboardTextFn)(const char* text, const char* text_end);
// Input - Fill before calling NewFrame()
ImVec2 MousePos; // Mouse position, in pixels (set to -1,-1 if no mouse / on another screen, etc.)
@@ -525,8 +531,11 @@
// User is responsible for providing a renderer for this in ImGuiIO::RenderDrawListFn
struct ImDrawList
{
- ImVector<ImDrawCmd> commands;
+ // This is what you have to render
+ ImVector<ImDrawCmd> commands; // commands
ImVector<ImDrawVert> vtx_buffer; // each command consume ImDrawCmd::vtx_count of those
+
+ // [Internal to ImGui]
ImVector<ImVec4> clip_rect_stack; // [internal] clip rect stack while building the command-list (so text command can perform clipping early on)
ImDrawVert* vtx_write; // [internal] point within vtx_buffer after each add command (to avoid using the ImVector<> operators too much)