diff options
Diffstat (limited to 'gtk/ScintillaGTK.cxx')
-rw-r--r-- | gtk/ScintillaGTK.cxx | 110 |
1 files changed, 54 insertions, 56 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 8a9dc283d..5194ec101 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -72,6 +72,8 @@ #pragma warning(disable: 4505) #endif +extern char *UTF8FromLatin1(const char *s, int &len); + class ScintillaGTK : public ScintillaBase { _ScintillaObject *sci; Window wText; @@ -727,9 +729,10 @@ void ScintillaGTK::DisplayCursor(Window::Cursor c) { void ScintillaGTK::StartDrag() { dragWasDropped = false; static const GtkTargetEntry targets[] = { + { "UTF8_STRING", 0, TARGET_UTF8_STRING }, { "STRING", 0, TARGET_STRING }, - { "TEXT", 0, TARGET_TEXT }, - { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }, + // { "TEXT", 0, TARGET_TEXT }, + // { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT }, }; static const gint n_targets = sizeof(targets) / sizeof(targets[0]); GtkTargetList *tl = gtk_target_list_new(targets, n_targets); @@ -1134,7 +1137,7 @@ int ScintillaGTK::KeyDefault(int key, int modifiers) { void ScintillaGTK::CopyToClipboard(const SelectionText &selectedText) { #if GTK_MAJOR_VERSION == 1 - copyText.Copy(selectedText.s, selectedText.len, selectedText.characterSet); + copyText.Copy(selectedText); gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), atomClipboard, GDK_CURRENT_TIME); @@ -1145,7 +1148,7 @@ void ScintillaGTK::CopyToClipboard(const SelectionText &selectedText) { return; SelectionText *clipText = new SelectionText(); - clipText->Copy(selectedText.s, selectedText.len, selectedText.characterSet); + clipText->Copy(selectedText); gtk_clipboard_set_with_data(clipBoard, clipboardTargets, nClipboardTargets, ClipboardGetSelection, ClipboardClearSelection, clipText); @@ -1246,19 +1249,19 @@ void ScintillaGTK::ClaimSelection() { primarySelection = true; gtk_selection_owner_set(GTK_WIDGET(PWidget(wMain)), GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); - primary.Set(0, 0, 0); + primary.Free(); } else if (OwnPrimarySelection()) { primarySelection = true; if (primary.s == NULL) gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, GDK_CURRENT_TIME); } else { primarySelection = false; - primary.Set(0, 0, 0); + primary.Free(); } } #ifdef USE_CONVERTER -static char *ConvertText(size_t *lenResult, char *s, size_t len, const char *charSetDest, const char *charSetSource) { +static char *ConvertText(int *lenResult, char *s, size_t len, const char *charSetDest, const char *charSetSource) { *lenResult = 0; char *destForm = 0; Converter conv(charSetDest, charSetSource); @@ -1270,7 +1273,7 @@ static char *ConvertText(size_t *lenResult, char *s, size_t len, const char *cha size_t outLeft = len*3+1; size_t conversions = conv.Convert(&pin, &inLeft, &pout, &outLeft); if (conversions == ((size_t)(-1))) { -fprintf(stderr, "iconv failed for %s\n", static_cast<char *>(s)); +fprintf(stderr, "iconv %s->%s failed for %s\n", charSetSource, charSetDest, static_cast<char *>(s)); delete []destForm; destForm = 0; } else { @@ -1292,7 +1295,7 @@ fprintf(stderr, "iconv failed for %s\n", static_cast<char *>(s)); // Convert line endings for a piece of text to a particular mode. // Stop at len or when a NUL is found. -char *ConvertLineEnds(size_t *pLenOut, const char *s, size_t len, int eolMode) { +char *ConvertLineEnds(int *pLenOut, const char *s, size_t len, int eolMode) { char *dest = new char[2 * len + 1]; const char *sptr = s; char *dptr = dest; @@ -1323,14 +1326,14 @@ char *ConvertLineEnds(size_t *pLenOut, const char *s, size_t len, int eolMode) { // Detect rectangular text, convert line ends to current mode, convert from or to UTF-8 void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText) { char *data = reinterpret_cast<char *>(selectionData->data); - size_t len = selectionData->length; + int len = selectionData->length; GdkAtom selectionType = selectionData->type; // Return empty string if selection is not a string if ((selectionType != GDK_TARGET_STRING) && (selectionType != atomUTF8)) { char *empty = new char[1]; empty[0] = '\0'; - selText.Set(empty, 0, SC_CP_UTF8); + selText.Set(empty, 0, SC_CP_UTF8, 0, false); return; } @@ -1342,48 +1345,34 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio isRectangular = ((len > 2) && (data[len - 1] == 0 && data[len - 2] == '\n')); #endif -#if GTK_MAJOR_VERSION >= 2 char *dest; - char *utf8 = reinterpret_cast<char*>(gtk_selection_data_get_text(selectionData)); - if (utf8 != NULL) { - dest = ConvertLineEnds(&len, utf8, strlen(utf8), pdoc->eolMode); - g_free(utf8); - } - else { - dest = new char[1]; - dest[0] = '\0'; - len = 0; - } - selText.Set(dest, len, SC_CP_UTF8, isRectangular); -#else - char *dest = ConvertLineEnds(&len, data, len, pdoc->eolMode); - if (selectionType == GDK_TARGET_STRING) - selText.Set(dest, len, pdoc->dbcsCodePage, isRectangular); - else - selText.Set(dest, len, SC_CP_UTF8, isRectangular); -#endif - -#ifdef USE_CONVERTER - // Possible character set conversion - const char *charSetBuffer = CharacterSetID(); - if (*charSetBuffer) { + if (selectionType == GDK_TARGET_STRING) { + dest = ConvertLineEnds(&len, data, len, pdoc->eolMode); if (IsUnicodeMode()) { - if (selText.characterSet != SC_CP_UTF8) { - // Convert to UTF-8 -//fprintf(stderr, "Convert to UTF-8 from %s\n", charSetBuffer); - dest = ConvertText(&len, selText.s, selText.len, "UTF-8", charSetBuffer); - selText.Set(dest, len, SC_CP_UTF8, selText.rectangular); - } + // Unknown encoding so assume in Latin1 + char *destPrevious = dest; + dest = UTF8FromLatin1(dest, len); + selText.Set(dest, len, SC_CP_UTF8, 0, selText.rectangular); + delete []destPrevious; } else { - if (selText.characterSet == SC_CP_UTF8) { -//fprintf(stderr, "Convert to locale %s\n", charSetBuffer); + // Assume buffer is in same encoding as selection + selText.Set(dest, len, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, isRectangular); + } + } else { // UTF-8 + dest = ConvertLineEnds(&len, data, len, pdoc->eolMode); + selText.Set(dest, len, SC_CP_UTF8, 0, isRectangular); +#ifdef USE_CONVERTER + const char *charSetBuffer = CharacterSetID(); + if (!IsUnicodeMode() && *charSetBuffer) { +//fprintf(stderr, "Convert to locale %s\n", CharacterSetID()); // Convert to locale dest = ConvertText(&len, selText.s, selText.len, charSetBuffer, "UTF-8"); - selText.Set(dest, len, pdoc->dbcsCodePage, selText.rectangular); - } + selText.Set(dest, len, pdoc->dbcsCodePage, + vs.styles[STYLE_DEFAULT].characterSet, selText.rectangular); } - } #endif + } } void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) { @@ -1437,14 +1426,16 @@ void ScintillaGTK::ReceivedDrop(GtkSelectionData *selection_data) { void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text) { #if GTK_MAJOR_VERSION >= 2 - (void)info; // Parameter unused on GTK+ 2 // Convert text to utf8 if it isn't already - if (text->characterSet != SC_CP_UTF8) { + SelectionText *converted = 0; + if ((text->codePage != SC_CP_UTF8) && (info == TARGET_UTF8_STRING)) { const char *charSet = ::CharacterSetID(text->characterSet); if (*charSet) { - size_t new_len; + int new_len; char* tmputf = ConvertText(&new_len, text->s, text->len, "UTF-8", charSet); - text->Set(tmputf, new_len, SC_CP_UTF8, text->rectangular); + converted = new SelectionText(); + converted->Set(tmputf, new_len, SC_CP_UTF8, 0, text->rectangular); + text = converted; } } @@ -1461,7 +1452,14 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se len++; #endif - gtk_selection_data_set_text(selection_data, text->s, len); + if (info == TARGET_UTF8_STRING) { + gtk_selection_data_set_text(selection_data, text->s, len); + } else { + gtk_selection_data_set(selection_data, + static_cast<GdkAtom>(GDK_SELECTION_TYPE_STRING), + 8, reinterpret_cast<unsigned char *>(text->s), len); + } + delete converted; #else /* Gtk 1 */ char *selBuffer = text->s; @@ -1471,26 +1469,26 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se // Many native win32 programs require \n line endings, // so make a copy of the clip text now with newlines converted - size_t new_len; + int new_len; char *tmpstr = ConvertLineEnds(&new_len, selBuffer, text->len, SC_EOL_LF); selBuffer = tmpstr; #endif char *tmputf = 0; if ((info == TARGET_UTF8_STRING) || (info == TARGET_STRING)) { - size_t len = strlen(selBuffer); + int len = strlen(selBuffer); #ifdef USE_CONVERTER // Possible character set conversion const char *charSetBuffer = ::CharacterSetID(text->characterSet); if (info == TARGET_UTF8_STRING) { //fprintf(stderr, "Copy to clipboard as UTF-8\n"); - if (text->characterSet != SC_CP_UTF8) { + if (text->codePage != SC_CP_UTF8) { // Convert to UTF-8 //fprintf(stderr, "Convert to UTF-8 from %s\n", charSetBuffer); tmputf = ConvertText(&len, selBuffer, len, "UTF-8", charSetBuffer); selBuffer = tmputf; } } else if (info == TARGET_STRING) { - if (text->characterSet == SC_CP_UTF8) { + if (text->codePage == SC_CP_UTF8) { //fprintf(stderr, "Convert to locale %s\n", charSetBuffer); // Convert to locale tmputf = ConvertText(&len, selBuffer, len, charSetBuffer, "UTF-8"); @@ -1550,7 +1548,7 @@ void ScintillaGTK::UnclaimSelection(GdkEventSelection *selection_event) { if (selection_event->selection == GDK_SELECTION_PRIMARY) { //Platform::DebugPrintf("UnclaimPrimarySelection\n"); if (!OwnPrimarySelection()) { - primary.Set(0, 0, 0); + primary.Free(); primarySelection = false; FullPaint(); } |