Index: src/scintilla/src/Editor.cxx
===================================================================
--- src/scintilla/src/Editor.cxx (revision 2387)
+++ src/scintilla/src/Editor.cxx (working copy)
@@ -5,6 +5,18 @@
// Copyright 1998-2004 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.
+//Lines tagged //pecan 20060506 is a patch to avoid the GTK drag'n'drop hang bug.
+//GTK is not handling a mouse "moving buttonUp" event well. The keyUp event is completely missed
+// causing wxGTK to hang in the drag routine waiting for the up event.GTK has the mouse captured,
+// so no event will ever be seen by wxGTK.
+//This is aggravated by the manner in which scintilla coded the mouse doubleClick.
+// It treats it as two single ButtonDown clicks, entering DragNdrop over and over again.
+//This patch moves the initiation of the drag into the MouseMove code to avoid the double click
+// problem. It will not allow secondary drags until a subsequent mouse up event.
+//This patch does not cure the problem, it can still happen if the user quickly drags
+// and lifts the mouse key at the same time the mouse is moving. But it's much harder
+// to cause the hang. Pecan
+
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -442,6 +454,9 @@
hsEnd = -1;
llc.SetLevel(LineLayoutCache::llcCaret);
+ #ifdef __WXGTK__
+ m_mouseButtonDownCnt = 0; //pecan 20060507
+ #endif
}
Editor::~Editor() {
@@ -1212,7 +1227,7 @@
where most code reside, and the lines after the caret, eg. the body of a function.
| | | | |
-slop | strict | jumps | even | Caret can go to the margin | When reaching limitÝ(caret going out of
+slop | strict | jumps | even | Caret can go to the margin | When reaching limit (caret going out of
| | | | | visibility or going into the UZ) display is...
-----+--------+-------+------+--------------------------------------------+--------------------------------------------------------------
0 | 0 | 0 | 0 | Yes | moved to put caret on top/on right
@@ -5037,6 +5052,9 @@
void Editor::ButtonDown(Point pt, unsigned int curTime, bool shift, bool ctrl, bool alt) {
//Platform::DebugPrintf("Scintilla:ButtonDown %d %d = %d alt=%d\n", curTime, lastClickTime, curTime - lastClickTime, alt);
+ #ifdef __WXGTK__
+ m_mouseButtonDownCnt++; //pecan 20060507
+ #endif
ptMouseLast = pt;
int newPos = PositionFromLocation(pt);
newPos = MovePositionOutsideChar(newPos, currentPos - newPos);
@@ -5124,12 +5142,18 @@
}
if (!shift) {
inDragDrop = PointInSelection(pt) && !SelectionEmpty();
+ #ifdef __WXGTK__
+ if (m_mouseButtonDownCnt>1) //pecan 20060507
+ inDragDrop = false; //pecan 20060507
+ #endif
}
if (inDragDrop) {
+ #ifndef __WXGTK__ //for GTK, code moved to ButtonMove() //pecan 20060507
SetMouseCapture(false);
SetDragPosition(newPos);
CopySelectionRange(&drag);
StartDrag();
+ #endif
} else {
SetDragPosition(invalidPosition);
SetMouseCapture(true);
@@ -5203,6 +5227,18 @@
}
ptMouseLast = pt;
//Platform::DebugPrintf("Move %d %d\n", pt.x, pt.y);
+ #ifdef __WXGTK__ //pecan 20060507
+ // code moved here from ButtonDown to avoid GTK doubleClick/drag hang bug
+ if (inDragDrop) {
+ SetMouseCapture(false);
+ int newPos = PositionFromLocation(pt);
+ SetDragPosition(newPos);
+ CopySelectionRange(&drag);
+ m_mouseButtonDownCnt++; //don't do again until mouse ButtonUp //pecan 20060507
+ StartDrag();
+ }
+ #endif //pecan 20060507
+
if (HaveMouseCapture()) {
// Slow down autoscrolling/selection
@@ -5289,7 +5325,10 @@
}
void Editor::ButtonUp(Point pt, unsigned int curTime, bool ctrl) {
- //Platform::DebugPrintf("ButtonUp %d\n", HaveMouseCapture());
+ //Platform::DebugPrintf("ButtonUp mouseCapture%d downCnt:%d", HaveMouseCapture(), m_mouseButtonDownCnt);
+ #ifdef __WXGTK__
+ m_mouseButtonDownCnt = 0; //pecan 20060507
+ #endif
if (HaveMouseCapture()) {
if (PointInSelMargin(pt)) {
DisplayCursor(Window::cursorReverseArrow);
Index: src/scintilla/src/Editor.h
===================================================================
--- src/scintilla/src/Editor.h (revision 2387)
+++ src/scintilla/src/Editor.h (working copy)
@@ -528,6 +528,8 @@
virtual sptr_t DefWndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) = 0;
+ int m_mouseButtonDownCnt; //pecan 20060507
+
public:
// Public so the COM thunks can access it.
bool IsUnicodeMode() const;