+#ifdef __WXGTK__
+ // Put the selected text in the PRIMARY selection
+ if (currentPos != anchor) {
+ SelectionText st;
+ CopySelectionRange(&st);
+ wxTheClipboard->UsePrimarySelection(true);
+ if (wxTheClipboard->Open()) {
+ wxString text = stc2wx(st.s, st.len);
+ wxTheClipboard->SetData(new wxTextDataObject(text));
+ wxTheClipboard->Close();
+ }
+ wxTheClipboard->UsePrimarySelection(false);
+ }
+#endif
+}
+
+
+void ScintillaWX::UpdateSystemCaret() {
+#ifdef __WXMSW__
+ if (hasFocus) {
+ if (HasCaretSizeChanged()) {
+ DestroySystemCaret();
+ CreateSystemCaret();
+ }
+ Point pos = LocationFromPosition(currentPos);
+ ::SetCaretPos(pos.x, pos.y);
+ }
+#endif
+}
+
+
+bool ScintillaWX::HasCaretSizeChanged() {
+#ifdef __WXMSW__
+ if (( (0 != vs.caretWidth) && (sysCaretWidth != vs.caretWidth) )
+ || (0 != vs.lineHeight) && (sysCaretHeight != vs.lineHeight)) {
+ return true;
+ }
+#endif
+ return false;
+}
+
+bool ScintillaWX::CreateSystemCaret() {
+#ifdef __WXMSW__
+ sysCaretWidth = vs.caretWidth;
+ if (0 == sysCaretWidth) {
+ sysCaretWidth = 1;
+ }
+ sysCaretHeight = vs.lineHeight;
+ int bitmapSize = (((sysCaretWidth + 15) & ~15) >> 3) * sysCaretHeight;
+ char *bits = new char[bitmapSize];
+ memset(bits, 0, bitmapSize);
+ sysCaretBitmap = ::CreateBitmap(sysCaretWidth, sysCaretHeight, 1,
+ 1, reinterpret_cast<BYTE *>(bits));
+ delete [] bits;
+ BOOL retval = ::CreateCaret(GetHwndOf(stc), sysCaretBitmap,
+ sysCaretWidth, sysCaretHeight);
+ ::ShowCaret(GetHwndOf(stc));
+ return retval != 0;
+#else
+ return false;
+#endif
+}