aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gtk/ScintillaGTK.cxx42
-rw-r--r--gtk/ScintillaGTK.h4
2 files changed, 32 insertions, 14 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx
index 5ee3b865a..524a8bb57 100644
--- a/gtk/ScintillaGTK.cxx
+++ b/gtk/ScintillaGTK.cxx
@@ -1282,7 +1282,7 @@ public:
static void ClipboardReceived(GtkClipboard *, GtkSelectionData *selection_data, gpointer data) {
SelectionReceiver *self = static_cast<SelectionReceiver *>(data);
if (self->sci) {
- self->sci->ReceivedSelection(selection_data);
+ self->sci->ReceivedClipboard(selection_data);
}
delete self;
}
@@ -1433,10 +1433,37 @@ void ScintillaGTK::GetGtkSelectionText(GtkSelectionData *selectionData, Selectio
}
}
+void ScintillaGTK::InsertSelection(GtkSelectionData *selectionData) {
+ const gint length = gtk_selection_data_get_length(selectionData);
+ if (length >= 0) {
+ GdkAtom selection = gtk_selection_data_get_selection(selectionData);
+ SelectionText selText;
+ GetGtkSelectionText(selectionData, selText);
+
+ UndoGroup ug(pdoc);
+ if (selection == GDK_SELECTION_CLIPBOARD) {
+ ClearSelection(multiPasteMode == SC_MULTIPASTE_EACH);
+ }
+
+ InsertPasteShape(selText.Data(), selText.Length(),
+ selText.rectangular ? pasteRectangular : pasteStream);
+ EnsureCaretVisible();
+ }
+ Redraw();
+}
+
GObject *ScintillaGTK::MainObject() const noexcept {
return G_OBJECT(PWidget(wMain));
}
+void ScintillaGTK::ReceivedClipboard(GtkSelectionData *selection_data) noexcept {
+ try {
+ InsertSelection(selection_data);
+ } catch (...) {
+ errorStatus = SC_STATUS_FAILURE;
+ }
+}
+
void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) {
try {
if ((SelectionOfGSD(selection_data) == GDK_SELECTION_CLIPBOARD) ||
@@ -1447,22 +1474,11 @@ void ScintillaGTK::ReceivedSelection(GtkSelectionData *selection_data) {
SelectionOfGSD(selection_data), atomSought, GDK_CURRENT_TIME);
} else if ((LengthOfGSD(selection_data) > 0) &&
((TypeOfGSD(selection_data) == GDK_TARGET_STRING) || (TypeOfGSD(selection_data) == atomUTF8))) {
- SelectionText selText;
- GetGtkSelectionText(selection_data, selText);
-
- UndoGroup ug(pdoc);
- if (SelectionOfGSD(selection_data) != GDK_SELECTION_PRIMARY) {
- ClearSelection(multiPasteMode == SC_MULTIPASTE_EACH);
- }
-
- InsertPasteShape(selText.Data(), selText.Length(),
- selText.rectangular ? pasteRectangular : pasteStream);
- EnsureCaretVisible();
+ InsertSelection(selection_data);
}
}
// else fprintf(stderr, "Target non string %d %d\n", (int)(selection_data->type),
// (int)(atomUTF8));
- Redraw();
} catch (...) {
errorStatus = SC_STATUS_FAILURE;
}
diff --git a/gtk/ScintillaGTK.h b/gtk/ScintillaGTK.h
index 27f900455..b87808824 100644
--- a/gtk/ScintillaGTK.h
+++ b/gtk/ScintillaGTK.h
@@ -133,10 +133,12 @@ private:
bool OwnPrimarySelection();
void ClaimSelection() override;
void GetGtkSelectionText(GtkSelectionData *selectionData, SelectionText &selText);
+ void InsertSelection(GtkSelectionData *selectionData);
public: // Public for SelectionReceiver
GObject *MainObject() const noexcept;
- void ReceivedSelection(GtkSelectionData *selection_data);
+ void ReceivedClipboard(GtkSelectionData *selection_data) noexcept;
private:
+ void ReceivedSelection(GtkSelectionData *selection_data);
void ReceivedDrop(GtkSelectionData *selection_data);
static void GetSelection(GtkSelectionData *selection_data, guint info, SelectionText *text);
void StoreOnClipboard(SelectionText *clipText);