Fix pasting large amounts of text in wxGTK.

We need to process GDK_PROPERTY_NOTIFY events when yielding for
wxEVT_CATEGORY_CLIPBOARD, otherwise we never receive large selections.

As GDK_PROPERTY_NOTIFY can be also used for non-clipboard stuff, exceptionally
assign 2 categories to it and process it in either case.

Closes #14284.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71439 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2012-05-15 10:04:11 +00:00
parent 4d769703f6
commit 5e4bbd0f45
2 changed files with 25 additions and 5 deletions

View File

@ -556,6 +556,7 @@ GTK:
- Implement wxDirDialog::Create() and wxFileDialog::Create() (vinayakgarg). - Implement wxDirDialog::Create() and wxFileDialog::Create() (vinayakgarg).
- Fix const methods display in assert dialog (vinayakgarg). - Fix const methods display in assert dialog (vinayakgarg).
- Implement native tab art for wxAUI (Jens Lody and Teodor Petrov). - Implement native tab art for wxAUI (Jens Lody and Teodor Petrov).
- Fix pasting large amounts of text (Bradley Hawkins).
MSW: MSW:

View File

@ -229,7 +229,11 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
// new event types (since new event types are always added in GDK with non // new event types (since new event types are always added in GDK with non
// conflicting values for ABI compatibility). // conflicting values for ABI compatibility).
wxEventCategory cat = wxEVT_CATEGORY_UNKNOWN; // Some events (currently only a single one) may be used for more than one
// category, so we need 2 variables. The second one will remain "unknown"
// in most cases.
wxEventCategory cat = wxEVT_CATEGORY_UNKNOWN,
cat2 = wxEVT_CATEGORY_UNKNOWN;
switch (event->type) switch (event->type)
{ {
case GDK_SELECTION_REQUEST: case GDK_SELECTION_REQUEST:
@ -252,6 +256,14 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
cat = wxEVT_CATEGORY_USER_INPUT; cat = wxEVT_CATEGORY_USER_INPUT;
break; break;
case GDK_PROPERTY_NOTIFY:
// This one is special: it can be used for UI purposes but also for
// clipboard operations, so allow it in both cases (we probably could
// examine the event itself to distinguish between the two cases but
// this would be unnecessarily complicated).
cat2 = wxEVT_CATEGORY_CLIPBOARD;
// Fall through.
case GDK_PROXIMITY_IN: case GDK_PROXIMITY_IN:
case GDK_PROXIMITY_OUT: case GDK_PROXIMITY_OUT:
@ -259,7 +271,6 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
case GDK_ENTER_NOTIFY: case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY: case GDK_LEAVE_NOTIFY:
case GDK_VISIBILITY_NOTIFY: case GDK_VISIBILITY_NOTIFY:
case GDK_PROPERTY_NOTIFY:
case GDK_FOCUS_CHANGE: case GDK_FOCUS_CHANGE:
case GDK_CONFIGURE: case GDK_CONFIGURE:
@ -296,11 +307,19 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
wxGUIEventLoop* evtloop = static_cast<wxGUIEventLoop*>(data); wxGUIEventLoop* evtloop = static_cast<wxGUIEventLoop*>(data);
// is this event allowed now? // is this event allowed now?
if (evtloop->IsEventAllowedInsideYield(cat)) if (evtloop->IsEventAllowedInsideYield(cat) ||
gtk_main_do_event(event); // process it now (cat2 != wxEVT_CATEGORY_UNKNOWN &&
evtloop->IsEventAllowedInsideYield(cat2)))
{
// process it now
gtk_main_do_event(event);
}
else if (event->type != GDK_NOTHING) else if (event->type != GDK_NOTHING)
{
// process it later (but make a copy; the caller will free the event
// pointer)
evtloop->StoreGdkEventForLaterProcessing(gdk_event_copy(event)); evtloop->StoreGdkEventForLaterProcessing(gdk_event_copy(event));
// process it later (but make a copy; the caller will free the event pointer) }
} }
} }