aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/ScintillaWin.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'win32/ScintillaWin.cxx')
-rw-r--r--win32/ScintillaWin.cxx38
1 files changed, 21 insertions, 17 deletions
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index f2f6976f5..916185569 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -22,6 +22,7 @@
#include <algorithm>
#include <memory>
#include <chrono>
+#include <mutex>
// Want to use std::min and std::max so don't want Windows.h version of min and max
#if !defined(NOMINMAX)
@@ -481,6 +482,7 @@ public:
/// Implement important part of IDataObject
STDMETHODIMP GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM);
+ static void Prepare() noexcept;
static bool Register(HINSTANCE hInstance_) noexcept;
static bool Unregister() noexcept;
@@ -3305,6 +3307,22 @@ STDMETHODIMP ScintillaWin::GetData(FORMATETC *pFEIn, STGMEDIUM *pSTM) {
return S_OK;
}
+void ScintillaWin::Prepare() noexcept {
+ Platform_Initialise(hInstance);
+
+ // Register the CallTip class
+ WNDCLASSEX wndclassc{};
+ wndclassc.cbSize = sizeof(wndclassc);
+ wndclassc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
+ wndclassc.cbWndExtra = sizeof(ScintillaWin *);
+ wndclassc.hInstance = hInstance;
+ wndclassc.lpfnWndProc = ScintillaWin::CTWndProc;
+ wndclassc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
+ wndclassc.lpszClassName = callClassName;
+
+ callClassAtom = ::RegisterClassEx(&wndclassc);
+}
+
bool ScintillaWin::Register(HINSTANCE hInstance_) noexcept {
hInstance = hInstance_;
@@ -3319,22 +3337,7 @@ bool ScintillaWin::Register(HINSTANCE hInstance_) noexcept {
wndclass.hInstance = hInstance;
wndclass.lpszClassName = L"Scintilla";
scintillaClassAtom = ::RegisterClassExW(&wndclass);
- bool result = 0 != scintillaClassAtom;
-
- if (result) {
- // Register the CallTip class
- WNDCLASSEX wndclassc {};
- wndclassc.cbSize = sizeof(wndclassc);
- wndclassc.style = CS_GLOBALCLASS | CS_HREDRAW | CS_VREDRAW;
- wndclassc.cbWndExtra = sizeof(ScintillaWin *);
- wndclassc.hInstance = hInstance;
- wndclassc.lpfnWndProc = ScintillaWin::CTWndProc;
- wndclassc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
- wndclassc.lpszClassName = callClassName;
-
- callClassAtom = ::RegisterClassEx(&wndclassc);
- result = 0 != callClassAtom;
- }
+ const bool result = 0 != scintillaClassAtom;
return result;
}
@@ -3522,6 +3525,8 @@ LRESULT PASCAL ScintillaWin::SWndProc(
if (sci == nullptr) {
try {
if (iMessage == WM_CREATE) {
+ static std::once_flag once;
+ std::call_once(once, Prepare);
// Create C++ object associated with window
sci = new ScintillaWin(hWnd);
SetWindowPointer(hWnd, sci);
@@ -3548,7 +3553,6 @@ LRESULT PASCAL ScintillaWin::SWndProc(
// This function is externally visible so it can be called from container when building statically.
// Must be called once only.
int Scintilla_RegisterClasses(void *hInstance) {
- Platform_Initialise(hInstance);
const bool result = ScintillaWin::Register(static_cast<HINSTANCE>(hInstance));
return result;
}