extern "C"
{
-static gboolean wx_on_channel_event(GIOChannel * WXUNUSED_UNLESS_DEBUG(channel),
+static gboolean wx_on_channel_event(GIOChannel *channel,
GIOCondition condition,
gpointer data)
{
+ wxUnusedVar(channel); // Unused if !wxUSE_LOG || !wxDEBUG_LEVEL
+
wxLogTrace(wxTRACE_EVT_SOURCE,
"wx_on_channel_event, fd=%d, condition=%08x",
g_io_channel_unix_get_fd(channel), condition);
// new event types (since new event types are always added in GDK with non
// 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)
{
case GDK_SELECTION_REQUEST:
case GDK_SELECTION_NOTIFY:
case GDK_SELECTION_CLEAR:
-#if GTK_CHECK_VERSION(2,6,0)
case GDK_OWNER_CHANGE:
-#endif
cat = wxEVT_CATEGORY_CLIPBOARD;
break;
cat = wxEVT_CATEGORY_USER_INPUT;
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_OUT:
case GDK_ENTER_NOTIFY:
case GDK_LEAVE_NOTIFY:
case GDK_VISIBILITY_NOTIFY:
- case GDK_PROPERTY_NOTIFY:
case GDK_FOCUS_CHANGE:
case GDK_CONFIGURE:
case GDK_DESTROY:
case GDK_EXPOSE:
+#ifndef __WXGTK3__
case GDK_NO_EXPOSE:
+#endif
case GDK_MAP:
case GDK_UNMAP:
wxGUIEventLoop* evtloop = static_cast<wxGUIEventLoop*>(data);
// is this event allowed now?
- if (evtloop->IsEventAllowedInsideYield(cat))
- gtk_main_do_event(event); // process it now
+ if (evtloop->IsEventAllowedInsideYield(cat) ||
+ (cat2 != wxEVT_CATEGORY_UNKNOWN &&
+ evtloop->IsEventAllowedInsideYield(cat2)))
+ {
+ // process it now
+ gtk_main_do_event(event);
+ }
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));
- // process it later (but make a copy; the caller will free the event pointer)
+ }
}
}
gtk_main_iteration();
gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
+ // Process all pending events too, this is consistent with wxMSW behaviour
+ // and the behaviour of wxGTK itself in the previous versions.
+ if ( wxTheApp )
+ wxTheApp->ProcessPendingEvents();
+
if (eventsToProcess != wxEVT_CATEGORY_CLIPBOARD)
{
// It's necessary to call ProcessIdle() to update the frames sizes which
// call ProcessIdle() only once since this is not meant for longish
// background jobs (controlled by wxIdleEvent::RequestMore() and the
// return value of Processidle().
- ProcessIdle(); // ProcessIdle() also calls ProcessPendingEvents()
+ ProcessIdle();
}
//else: if we are inside ~wxClipboardSync() and we call ProcessIdle() and
// the user app contains an UI update handler which calls wxClipboard::IsSupported,