From eaadbdeba0045d06d0d8a751c5057ed3386f7c3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jir=CC=8Ci=CC=81=20Techet?= Date: Fri, 24 Mar 2023 23:10:09 +0100 Subject: [PATCH] Patch Scintilla to use \1 as the indicator of block copy This probably doesn't work well when pasting to other applications and is kind of hack (on top of another hack) so not submitting to Scintilla as it would probably be rejected. --- geany.modules | 2 + .../01-geany_scintilla_block_copy.patch | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 geany_patches/01-geany_scintilla_block_copy.patch diff --git a/geany.modules b/geany.modules index 96fd855e..30d2f15c 100644 --- a/geany.modules +++ b/geany.modules @@ -116,6 +116,7 @@ + @@ -134,6 +135,7 @@ + diff --git a/geany_patches/01-geany_scintilla_block_copy.patch b/geany_patches/01-geany_scintilla_block_copy.patch new file mode 100644 index 00000000..45ffe33a --- /dev/null +++ b/geany_patches/01-geany_scintilla_block_copy.patch @@ -0,0 +1,54 @@ +From 31d01326bbe39a8b11d1ab0b0f01fe433288c19c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ji=C5=99=C3=AD=20Techet?= +Date: Fri, 24 Mar 2023 22:55:17 +0100 +Subject: Scintilla: replace \0 indicating block copy with \1 + +This will almost surely include \1 in other applications but at least +block copy paste will work within Geany. + +diff --git a/scintilla/gtk/ScintillaGTK.cxx b/scintilla/gtk/ScintillaGTK.cxx +index 7a8c4d0b5..717bb3560 100644 +--- a/scintilla/gtk/ScintillaGTK.cxx ++++ b/scintilla/gtk/ScintillaGTK.cxx +@@ -1520,14 +1520,14 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio + return; + } + +- // Check for "\n\0" ending to string indicating that selection is rectangular ++ // Check for "\n\1" ending to string indicating that selection is rectangular + bool isRectangular; + #if PLAT_GTK_WIN32 + isRectangular = ::IsClipboardFormatAvailable(cfColumnSelect) != 0; + #else +- isRectangular = ((len > 2) && (data[len - 1] == 0 && data[len - 2] == '\n')); ++ isRectangular = ((len > 2) && (data[len - 1] == 1 && data[len - 2] == '\n')); + if (isRectangular) +- len--; // Forget the extra '\0' ++ len--; // Forget the extra '\1' + #endif + + #if PLAT_GTK_WIN32 +@@ -1681,8 +1681,14 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se + // All other tested applications behave benignly by ignoring the \0. + // The #if is here because on Windows cfColumnSelect clip entry is used + // instead as standard indicator of rectangularness (so no need to kludge) +- const char *textData = text->Data(); ++ ++ // Jiri Techet: Even more evil thing: \0 is dropped by macOS so let's use \1. ++ // This will probably lead to pasting \1 in other applications but at least ++ // makes rectangular copy work in Geany. ++ const char *textData1 = text->Data(); + gint len = static_cast(text->Length()); ++ char *textData = g_strdup(textData1); ++ textData[len] = '\1'; + #if PLAT_GTK_WIN32 == 0 + if (text->rectangular) + len++; +@@ -1695,6 +1701,7 @@ void ScintillaGTK::GetSelection(GtkSelectionData *selection_data, guint info, Se + static_cast(GDK_SELECTION_TYPE_STRING), + 8, reinterpret_cast(textData), len); + } ++ g_free(textData); + } + + void ScintillaGTK::StoreOnClipboard(SelectionText *clipText) {