diff --git a/Makefile.in b/Makefile.in
index 1f6e0db0b6..973b14e02e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -64,6 +64,7 @@ EXTRALIBS_MEDIA = @EXTRALIBS_MEDIA@
EXTRALIBS_GUI = @EXTRALIBS_GUI@
EXTRALIBS_OPENGL = @EXTRALIBS_OPENGL@
EXTRALIBS_SDL = @EXTRALIBS_SDL@
+EXTRALIBS_STC = @EXTRALIBS_STC@
EXTRALIBS_WEBVIEW = @EXTRALIBS_WEBVIEW@
WX_CPPFLAGS = @WX_CPPFLAGS@
WX_CFLAGS = @WX_CFLAGS@
@@ -14600,7 +14601,7 @@ distclean: clean
@COND_MONOLITHIC_0_USE_RICHTEXT_1@wxrichtext: $(____wxrichtext_namedll_DEP) $(____wxrichtext_namelib_DEP)
@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@$(LIBDIRNAME)/$(DLLPREFIX)$(WXDLLNAMEPREFIXGUI)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc$(WXCOMPILER)$(VENDORTAG)$(WXDLLVERSIONTAG)$(dll___targetsuf3): $(STCDLL_OBJECTS) $(__wxexpat___depname) $(__wxzlib___depname) $(__wxregex___depname) $(__wxtiff___depname) $(__wxjpeg___depname) $(__wxpng___depname) $(__wxscintilla___depname) $(__wxscintilla___depname) $(__stcdll___win32rc) $(__coredll___depname) $(__basedll___depname)
-@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@ $(SHARED_LD_CXX) $@ $(STCDLL_OBJECTS) -L$(LIBDIRNAME) -L$(LIBDIRNAME) -L$(LIBDIRNAME) -L$(LIBDIRNAME) $(__stcdll___macinstnamecmd) $(__stcdll___importlib) $(__stcdll___soname_flags) $(WXMACVERSION_CMD) $(LDFLAGS) $(WX_LDFLAGS) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE) -lwxscintilla$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX) -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX) -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX) $(LIBS)
+@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@ $(SHARED_LD_CXX) $@ $(STCDLL_OBJECTS) -L$(LIBDIRNAME) -L$(LIBDIRNAME) -L$(LIBDIRNAME) -L$(LIBDIRNAME) $(__stcdll___macinstnamecmd) $(__stcdll___importlib) $(__stcdll___soname_flags) $(WXMACVERSION_CMD) $(LDFLAGS) $(WX_LDFLAGS) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) $(EXTRALIBS_FOR_GUI) $(__LIB_ZLIB_p) $(__LIB_REGEX_p) $(__LIB_EXPAT_p) $(EXTRALIBS_FOR_BASE) -lwxscintilla$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX) -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core-$(WX_RELEASE)$(HOST_SUFFIX) -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)-$(WX_RELEASE)$(HOST_SUFFIX) $(EXTRALIBS_STC) $(LIBS)
@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@ $(DYLIB_RPATH_POSTLINK)
@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@
@COND_MONOLITHIC_0_SHARED_1_USE_STC_1@ $(__stcdll___so_symlinks_cmd)
diff --git a/build/bakefiles/config.bkl b/build/bakefiles/config.bkl
index b08c08dada..1e5459260c 100644
--- a/build/bakefiles/config.bkl
+++ b/build/bakefiles/config.bkl
@@ -411,6 +411,7 @@ compiled .lib files and setup.h under the lib/ toplevel directory.
+
@@ -492,6 +493,11 @@ it if SHARED=1 unless you know what you are doing.
-lopengl32 -lglu32
+
+ imm32.lib
+ imm32.lib
+ -limm32
+
0
diff --git a/build/bakefiles/multilib.bkl b/build/bakefiles/multilib.bkl
index b9ec796c82..3367df44bc 100644
--- a/build/bakefiles/multilib.bkl
+++ b/build/bakefiles/multilib.bkl
@@ -402,6 +402,7 @@
$(STC_SRC)
coredll
basedll
+ $(EXTRALIBS_STC)
$(STC_HDR)
diff --git a/build/cmake/lib/stc/CMakeLists.txt b/build/cmake/lib/stc/CMakeLists.txt
index 44c6a75f6f..bd6acd858c 100644
--- a/build/cmake/lib/stc/CMakeLists.txt
+++ b/build/cmake/lib/stc/CMakeLists.txt
@@ -195,5 +195,8 @@ wx_lib_compile_definitions(wxstc PRIVATE
LINK_LEXERS
)
wx_lib_link_libraries(wxstc PRIVATE wxscintilla)
+if(WXMSW)
+ wx_lib_link_libraries(wxstc PRIVATE imm32)
+endif()
wx_finalize_lib(wxstc)
diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc
index 559a597ba6..68872e848a 100644
--- a/build/msw/makefile.bcc
+++ b/build/msw/makefile.bcc
@@ -5536,7 +5536,7 @@ wxrichtext: $(____wxrichtext_namedll_DEP) $(____wxrichtext_namelib_DEP)
!if "$(MONOLITHIC)" == "0" && "$(SHARED)" == "1" && "$(USE_STC)" == "1"
$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc$(WXCOMPILER)$(VENDORTAG).dll: $(OBJS)\stcdll_dummy.obj $(STCDLL_OBJECTS) $(LIBDIRNAME)\wxexpat$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wxzlib$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib $(__wxtiff___depname) $(__wxjpeg___depname) $(__wxpng___depname) $(__wxscintilla) $(__wxscintilla) $(OBJS)\stcdll_version.res $(__coredll___depname) $(__basedll___depname)
ilink32 -Tpd -q -L$(BCCDIR)\lib -L$(BCCDIR)\lib\psdk $(__DEBUGINFO) -L$(LIBDIRNAME) $(____CAIRO_LIBDIR_FILENAMES) $(LDFLAGS) @&&|
- c0d32.obj $(STCDLL_OBJECTS),$@,, $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) ole2w32.lib oleacc.lib uxtheme.lib $(LIBDIRNAME)\wxscintilla$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib $(LIBDIRNAME)\wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib import32.lib cw32$(__THREADSFLAG_14)$(__RUNTIME_LIBS_5).lib,, $(OBJS)\stcdll_version.res
+ c0d32.obj $(STCDLL_OBJECTS),$@,, $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) ole2w32.lib oleacc.lib uxtheme.lib $(LIBDIRNAME)\wxscintilla$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib $(LIBDIRNAME)\wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib import32.lib cw32$(__THREADSFLAG_14)$(__RUNTIME_LIBS_5).lib,, $(OBJS)\stcdll_version.res
|
implib -f $(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc $@
!endif
diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc
index a84781e6f4..1a5f77d63c 100644
--- a/build/msw/makefile.gcc
+++ b/build/msw/makefile.gcc
@@ -5822,7 +5822,7 @@ ifeq ($(USE_STC),1)
$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc$(WXCOMPILER)$(VENDORTAG).dll: $(STCDLL_OBJECTS) $(LIBDIRNAME)\libwxexpat$(WXDEBUGFLAG).a $(LIBDIRNAME)\libwxzlib$(WXDEBUGFLAG).a $(LIBDIRNAME)\libwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).a $(__wxtiff___depname) $(__wxjpeg___depname) $(__wxpng___depname) $(__wxscintilla) $(__wxscintilla) $(OBJS)\stcdll_version_rc.o $(__coredll___depname) $(__basedll___depname)
$(foreach f,$(subst \,/,$(STCDLL_OBJECTS)),$(shell echo $f >> $(subst \,/,$@).rsp.tmp))
@move /y $@.rsp.tmp $@.rsp >nul
- $(CXX) $(LINK_DLL_FLAGS) -fPIC -o $@ @$@.rsp $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--out-implib=$(LIBDIRNAME)\libwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc.a $(____CAIRO_LIBDIR_FILENAMES) $(LDFLAGS) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lversion -lwsock32 -lwininet -loleacc -luxtheme $(LIBDIRNAME)\libwxscintilla$(WXDEBUGFLAG).a $(LIBDIRNAME)\libwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.a $(LIBDIRNAME)\libwxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).a
+ $(CXX) $(LINK_DLL_FLAGS) -fPIC -o $@ @$@.rsp $(__DEBUGINFO) $(__THREADSFLAG) -L$(LIBDIRNAME) -Wl,--out-implib=$(LIBDIRNAME)\libwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc.a $(____CAIRO_LIBDIR_FILENAMES) $(LDFLAGS) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) -lwxzlib$(WXDEBUGFLAG) -lwxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG) -lwxexpat$(WXDEBUGFLAG) $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lshell32 -lshlwapi -lcomctl32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lversion -lwsock32 -lwininet -loleacc -luxtheme $(LIBDIRNAME)\libwxscintilla$(WXDEBUGFLAG).a $(LIBDIRNAME)\libwx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.a $(LIBDIRNAME)\libwxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).a -limm32
@-del $@.rsp
endif
endif
diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc
index 51b14b1c67..aed6ebedbb 100644
--- a/build/msw/makefile.vc
+++ b/build/msw/makefile.vc
@@ -6454,7 +6454,7 @@ wxrichtext: $(____wxrichtext_namedll_DEP) $(____wxrichtext_namelib_DEP)
!if "$(MONOLITHIC)" == "0" && "$(SHARED)" == "1" && "$(USE_STC)" == "1"
$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc$(WXCOMPILER)$(VENDORTAG).dll: $(OBJS)\stcdll_dummy.obj $(STCDLL_OBJECTS) $(LIBDIRNAME)\wxexpat$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wxzlib$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib $(__wxtiff___depname) $(__wxjpeg___depname) $(__wxpng___depname) $(__wxscintilla) $(__wxscintilla) $(OBJS)\stcdll_version.res $(__coredll___depname) $(__basedll___depname)
link /DLL /NOLOGO /OUT:$@ $(__DEBUGINFO_6) /pdb:"$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_VERSION_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc$(WXCOMPILER)$(VENDORTAG).pdb" $(__DEBUGINFO_573) $(WIN32_DPI_LINKFLAG) $(LINK_TARGET_CPU) /LIBPATH:$(LIBDIRNAME) $(____CAIRO_LIBDIR_FILENAMES) $(LDFLAGS) @<<
- $(STCDLL_OBJECTS) $(STCDLL_RESOURCES) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib shlwapi.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib version.lib wsock32.lib wininet.lib $(LIBDIRNAME)\wxscintilla$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib $(LIBDIRNAME)\wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib /IMPLIB:$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc.lib
+ $(STCDLL_OBJECTS) $(STCDLL_RESOURCES) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib $(EXTRALIBS_FOR_BASE) $(__CAIRO_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib shlwapi.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib version.lib wsock32.lib wininet.lib $(LIBDIRNAME)\wxscintilla$(WXDEBUGFLAG).lib $(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib $(LIBDIRNAME)\wxbase$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib imm32.lib /IMPLIB:$(LIBDIRNAME)\wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_stc.lib
<<
!endif
diff --git a/build/msw/wx_vc7_stc.vcproj b/build/msw/wx_vc7_stc.vcproj
index c04829544a..a4eb8b5639 100644
--- a/build/msw/wx_vc7_stc.vcproj
+++ b/build/msw/wx_vc7_stc.vcproj
@@ -166,7 +166,7 @@
&2
fi
+if test "$wxUSE_MSW" = 1 ; then
+ EXTRALIBS_STC="-limm32"
+fi
+
+
if test "x$prefix" != "xNONE"; then
wxPREFIX=$prefix
else
@@ -37694,7 +37699,6 @@ EXTRALIBS="$LDFLAGS $LDFLAGS_VERSIONING $LIBS $DMALLOC_LIBS"
EXTRALIBS_XML="$EXPAT_LINK"
EXTRALIBS_HTML="$MSPACK_LINK"
EXTRALIBS_MEDIA="$GST_LIBS"
-EXTRALIBS_STC="-lwxscintilla${WX_LIB_FLAVOUR}-${WX_RELEASE}${HOST_SUFFIX}"
if test "$wxUSE_GUI" = "yes"; then
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $SDL_LIBS $PNG_LINK $JPEG_LINK $TIFF_LINK $LZMA_LINK $JBIG_LINK $WEBKIT_LINK`
fi
diff --git a/configure.in b/configure.in
index 4bf3edd290..b99a2aae7b 100644
--- a/configure.in
+++ b/configure.in
@@ -7704,6 +7704,14 @@ if test "$wxUSE_MEDIACTRL" = "yes" -o "$wxUSE_MEDIACTRL" = "auto"; then
fi
fi
+dnl ---------------------------------------------------------------------------
+dnl wxStyledTextCtrl
+dnl ---------------------------------------------------------------------------
+
+if test "$wxUSE_MSW" = 1 ; then
+ EXTRALIBS_STC="-limm32"
+fi
+
dnl ---------------------------------------------------------------------------
dnl define the variable containing the installation prefix (used in dcpsg.cpp)
dnl ---------------------------------------------------------------------------
@@ -7962,7 +7970,6 @@ EXTRALIBS="$LDFLAGS $LDFLAGS_VERSIONING $LIBS $DMALLOC_LIBS"
EXTRALIBS_XML="$EXPAT_LINK"
EXTRALIBS_HTML="$MSPACK_LINK"
EXTRALIBS_MEDIA="$GST_LIBS"
-EXTRALIBS_STC="-lwxscintilla${WX_LIB_FLAVOUR}-${WX_RELEASE}${HOST_SUFFIX}"
if test "$wxUSE_GUI" = "yes"; then
EXTRALIBS_GUI=`echo $GUI_TK_LIBRARY $SDL_LIBS $PNG_LINK $JPEG_LINK $TIFF_LINK $LZMA_LINK $JBIG_LINK $WEBKIT_LINK`
fi
diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h
index 0bc3ea10d3..620743f186 100644
--- a/include/wx/stc/stc.h
+++ b/include/wx/stc/stc.h
@@ -5493,6 +5493,10 @@ protected:
void NotifyChange();
void NotifyParent(SCNotification* scn);
+#ifdef __WXMSW__
+ virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE;
+#endif // __WXMSW__
+
private:
wxDECLARE_EVENT_TABLE();
wxDECLARE_DYNAMIC_CLASS(wxStyledTextCtrl);
diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp
index 7e7580518d..74f446229d 100644
--- a/src/stc/ScintillaWX.cpp
+++ b/src/stc/ScintillaWX.cpp
@@ -45,6 +45,7 @@
#include "ScintillaWX.h"
#include "ExternalLexer.h"
+#include "UniConversion.h"
#include "wx/stc/stc.h"
#include "wx/stc/private.h"
#include "PlatWX.h"
@@ -844,6 +845,25 @@ sptr_t ScintillaWX::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam)
case SCI_GETDIRECTPOINTER:
return reinterpret_cast(this);
+#ifdef __WXMSW__
+ // ScintillaWin
+ case WM_IME_STARTCOMPOSITION:
+ // Always use windowed IME in ScintillaWX for now. Inline IME not implemented yet
+ ImeStartComposition();
+ return stc->wxControl::MSWWindowProc(iMessage, wParam, lParam);
+
+ case WM_IME_ENDCOMPOSITION:
+ ImeEndComposition();
+ return stc->wxControl::MSWWindowProc(iMessage, wParam, lParam);
+
+ case WM_IME_KEYDOWN:
+ case WM_IME_REQUEST:
+ case WM_IME_COMPOSITION:
+ case WM_IME_SETCONTEXT:
+ // These events are forwarded here for future inline IME implementation
+ return stc->wxControl::MSWWindowProc(iMessage, wParam, lParam);
+#endif
+
default:
return ScintillaBase::WndProc(iMessage, wParam, lParam);
}
@@ -1407,6 +1427,118 @@ sptr_t ScintillaWX::DirectFunction(
return swx->WndProc(iMessage, wParam, lParam);
}
+//----------------------------------------------------------------------
+// ScintillaWin
+
+#ifdef __WXMSW__
+
+#ifdef __VISUALC__
+#pragma comment(lib, "imm32.lib")
+#endif
+
+namespace {
+
+POINT POINTFromPoint(Point pt) wxNOEXCEPT {
+ POINT ret;
+ ret.x = static_cast(pt.x);
+ ret.y = static_cast(pt.y);
+ return ret;
+}
+
+class IMContext {
+ HWND hwnd;
+public:
+ HIMC hIMC;
+ IMContext(HWND hwnd_) wxNOEXCEPT :
+ hwnd(hwnd_), hIMC(::ImmGetContext(hwnd_)) {
+ }
+ ~IMContext() {
+ if (hIMC)
+ ::ImmReleaseContext(hwnd, hIMC);
+ }
+
+ unsigned int GetImeCaretPos() const wxNOEXCEPT {
+ return ImmGetCompositionStringW(hIMC, GCS_CURSORPOS, wxNullPtr, 0);
+ }
+
+ std::vector GetImeAttributes() {
+ const int attrLen = ::ImmGetCompositionStringW(hIMC, GCS_COMPATTR, wxNullPtr, 0);
+ std::vector attr(attrLen, 0);
+ ::ImmGetCompositionStringW(hIMC, GCS_COMPATTR, &attr[0], static_cast(attr.size()));
+ return attr;
+ }
+
+ std::wstring GetCompositionString(DWORD dwIndex) {
+ const LONG byteLen = ::ImmGetCompositionStringW(hIMC, dwIndex, wxNullPtr, 0);
+ std::wstring wcs(byteLen / 2, 0);
+ ::ImmGetCompositionStringW(hIMC, dwIndex, &wcs[0], byteLen);
+ return wcs;
+ }
+private:
+ // Private so IMContext objects can not be copied.
+ IMContext(const IMContext&);
+ IMContext& operator=(const IMContext&);
+};
+
+}
+
+HWND ScintillaWX::MainHWND() const wxNOEXCEPT {
+ return static_cast(wMain.GetID());
+}
+
+/**
+ * DBCS: support Input Method Editor (IME).
+ * Called when IME Window opened.
+ */
+void ScintillaWX::ImeStartComposition() {
+ if (caret.active) {
+ // Move IME Window to current caret position
+ IMContext imc(stc->GetHandle());
+ const Point pos = PointMainCaret();
+ COMPOSITIONFORM CompForm;
+ CompForm.dwStyle = CFS_POINT;
+ CompForm.ptCurrentPos = POINTFromPoint(pos);
+
+ ::ImmSetCompositionWindow(imc.hIMC, &CompForm);
+
+ // Set font of IME window to same as surrounded text.
+ if (stylesValid) {
+ // Since the style creation code has been made platform independent,
+ // The logfont for the IME is recreated here.
+ const int styleHere = pdoc->StyleIndexAt(sel.MainCaret());
+ LOGFONTW lf = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, L"" };
+ int sizeZoomed = vs.styles[styleHere].size + vs.zoomLevel * SC_FONT_SIZE_MULTIPLIER;
+ if (sizeZoomed <= 2 * SC_FONT_SIZE_MULTIPLIER) // Hangs if sizeZoomed <= 1
+ sizeZoomed = 2 * SC_FONT_SIZE_MULTIPLIER;
+ AutoSurface surface(this);
+ int deviceHeight = sizeZoomed;
+ if (surface) {
+ deviceHeight = (sizeZoomed * surface->LogPixelsY()) / 72;
+ }
+ // The negative is to allow for leading
+ lf.lfHeight = -(std::abs(deviceHeight / SC_FONT_SIZE_MULTIPLIER));
+ lf.lfWeight = vs.styles[styleHere].weight;
+ lf.lfItalic = static_cast(vs.styles[styleHere].italic ? 1 : 0);
+ lf.lfCharSet = DEFAULT_CHARSET;
+ lf.lfFaceName[0] = L'\0';
+ if (vs.styles[styleHere].fontName) {
+ const char* fontName = vs.styles[styleHere].fontName;
+ UTF16FromUTF8(fontName, strlen(fontName)+1, lf.lfFaceName, LF_FACESIZE);
+ }
+
+ ::ImmSetCompositionFontW(imc.hIMC, &lf);
+ }
+ // Caret is displayed in IME window. So, caret in Scintilla is useless.
+ DropCaret();
+ }
+}
+
+/** Called when IME Window closed. */
+void ScintillaWX::ImeEndComposition() {
+ ShowCaretAtCurrentPosition();
+}
+#endif // __WXMSW__
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------
diff --git a/src/stc/ScintillaWX.h b/src/stc/ScintillaWX.h
index 92079170e3..dfe97e1d4f 100644
--- a/src/stc/ScintillaWX.h
+++ b/src/stc/ScintillaWX.h
@@ -238,6 +238,15 @@ private:
wxDataFormat m_clipRectTextFormat;
#endif
+#ifdef __WXMSW__
+ // ScintillaWin
+ HWND MainHWND() const wxNOEXCEPT;
+
+ // DBCS
+ void ImeStartComposition();
+ void ImeEndComposition();
+#endif
+
friend class wxSTCCallTip;
friend class wxSTCTimer; // To get access to TickReason declaration
};
diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp
index 561379d7d3..2ae931b4e1 100644
--- a/src/stc/stc.cpp
+++ b/src/stc/stc.cpp
@@ -5674,6 +5674,26 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
GetEventHandler()->ProcessEvent(evt);
}
+#ifdef __WXMSW__
+WXLRESULT wxStyledTextCtrl::MSWWindowProc(WXUINT nMsg,
+ WXWPARAM wParam,
+ WXLPARAM lParam)
+{
+ switch(nMsg) {
+ // Forward IME messages to ScintillaWX
+ case WM_IME_KEYDOWN:
+ case WM_IME_REQUEST:
+ case WM_IME_STARTCOMPOSITION:
+ case WM_IME_ENDCOMPOSITION:
+ case WM_IME_COMPOSITION:
+ case WM_IME_SETCONTEXT:
+ return SendMsg(nMsg, wParam, lParam);
+ default:
+ return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+ }
+}
+#endif
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------
diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in
index d2a256e20c..63db3db362 100644
--- a/src/stc/stc.cpp.in
+++ b/src/stc/stc.cpp.in
@@ -1201,6 +1201,26 @@ void wxStyledTextCtrl::NotifyParent(SCNotification* _scn) {
GetEventHandler()->ProcessEvent(evt);
}
+#ifdef __WXMSW__
+WXLRESULT wxStyledTextCtrl::MSWWindowProc(WXUINT nMsg,
+ WXWPARAM wParam,
+ WXLPARAM lParam)
+{
+ switch(nMsg) {
+ // Forward IME messages to ScintillaWX
+ case WM_IME_KEYDOWN:
+ case WM_IME_REQUEST:
+ case WM_IME_STARTCOMPOSITION:
+ case WM_IME_ENDCOMPOSITION:
+ case WM_IME_COMPOSITION:
+ case WM_IME_SETCONTEXT:
+ return SendMsg(nMsg, wParam, lParam);
+ default:
+ return wxControl::MSWWindowProc(nMsg, wParam, lParam);
+ }
+}
+#endif
+
//----------------------------------------------------------------------
//----------------------------------------------------------------------
diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in
index 925f4b9b1d..6011cf94c9 100644
--- a/src/stc/stc.h.in
+++ b/src/stc/stc.h.in
@@ -611,6 +611,10 @@ protected:
void NotifyChange();
void NotifyParent(SCNotification* scn);
+#ifdef __WXMSW__
+ virtual WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) wxOVERRIDE;
+#endif // __WXMSW__
+
private:
wxDECLARE_EVENT_TABLE();
wxDECLARE_DYNAMIC_CLASS(wxStyledTextCtrl);