diff options
author | Neil Hodgson <nyamatongwe@gmail.com> | 2013-05-25 15:38:27 +1000 |
---|---|---|
committer | Neil Hodgson <nyamatongwe@gmail.com> | 2013-05-25 15:38:27 +1000 |
commit | 3eb0dea3286c294932208de6b1f6dc0e8bc4d2db (patch) | |
tree | ad8d2a1183b3d92e9909d823e952251ce32b10e9 | |
parent | a5256ce1302b41b7d3cb92d6393d0c86cd4723d0 (diff) | |
download | scintilla-mirror-3eb0dea3286c294932208de6b1f6dc0e8bc4d2db.tar.gz |
Bug: [#1481]. Incorrect event copying on GTK+ 3.x.
-rw-r--r-- | gtk/ScintillaGTK.cxx | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index 74879beda..d883abdd1 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -122,7 +122,7 @@ class ScintillaGTK : public ScintillaBase { SelectionText primary; - GdkEventButton evbtn; + GdkEventButton *evbtn; bool capturedMouse; bool dragWasDropped; int lastKey; @@ -354,7 +354,7 @@ static ScintillaGTK *ScintillaFromWidget(GtkWidget *widget) { ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : adjustmentv(0), adjustmenth(0), scrollBarWidth(30), scrollBarHeight(30), - capturedMouse(false), dragWasDropped(false), + evbtn(0), capturedMouse(false), dragWasDropped(false), lastKey(0), rectangularSelectionModifier(SCMOD_CTRL), parentClass(0), im_context(NULL), lastWheelMouseDirection(0), @@ -392,6 +392,10 @@ ScintillaGTK::ScintillaGTK(_ScintillaObject *sci_) : ScintillaGTK::~ScintillaGTK() { g_idle_remove_by_data(this); + if (evbtn) { + gdk_event_free(reinterpret_cast<GdkEvent *>(evbtn)); + evbtn = 0; + } } static void UnRefCursor(GdkCursor *cursor) { @@ -824,14 +828,15 @@ bool ScintillaGTK::DragThreshold(Point ptStart, Point ptNow) { } void ScintillaGTK::StartDrag() { + PLATFORM_ASSERT(evbtn != 0); dragWasDropped = false; inDragDrop = ddDragging; GtkTargetList *tl = gtk_target_list_new(clipboardCopyTargets, nClipboardCopyTargets); gtk_drag_begin(GTK_WIDGET(PWidget(wMain)), tl, static_cast<GdkDragAction>(GDK_ACTION_COPY | GDK_ACTION_MOVE), - evbtn.button, - reinterpret_cast<GdkEvent *>(&evbtn)); + evbtn->button, + reinterpret_cast<GdkEvent *>(evbtn)); } static std::string ConvertText(char *s, size_t len, const char *charSetDest, @@ -1761,7 +1766,11 @@ gint ScintillaGTK::PressThis(GdkEventButton *event) { if (event->type != GDK_BUTTON_PRESS) return FALSE; - evbtn = *event; + if (evbtn) { + gdk_event_free(reinterpret_cast<GdkEvent *>(evbtn)); + evbtn = 0; + } + evbtn = reinterpret_cast<GdkEventButton *>(gdk_event_copy(reinterpret_cast<GdkEvent *>(event))); Point pt; pt.x = int(event->x); pt.y = int(event->y); |