]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/evtloop.cpp
Fix broken and missing DataView interface items for Phoenix
[wxWidgets.git] / src / gtk / evtloop.cpp
index 58e5a4f478cd3f591a7376e94f60c68aa39d0ddb..cc118104d55a9dceae266e2a3e1e39f42457ab8f 100644 (file)
@@ -95,6 +95,8 @@ static gboolean wx_on_channel_event(GIOChannel *channel,
                                     GIOCondition condition,
                                     gpointer data)
 {
                                     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);
     wxLogTrace(wxTRACE_EVT_SOURCE,
                "wx_on_channel_event, fd=%d, condition=%08x",
                g_io_channel_unix_get_fd(channel), condition);
@@ -227,15 +229,17 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
     //       new event types (since new event types are always added in GDK with non
     //       conflicting values for ABI compatibility).
 
     //       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:
     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:
     case GDK_OWNER_CHANGE:
-#endif
         cat = wxEVT_CATEGORY_CLIPBOARD;
         break;
 
         cat = wxEVT_CATEGORY_CLIPBOARD;
         break;
 
@@ -250,6 +254,14 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
         cat = wxEVT_CATEGORY_USER_INPUT;
         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_PROXIMITY_IN:
     case GDK_PROXIMITY_OUT:
 
@@ -257,7 +269,6 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
     case GDK_VISIBILITY_NOTIFY:
     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_FOCUS_CHANGE:
     case GDK_CONFIGURE:
@@ -267,7 +278,9 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
     case GDK_DESTROY:
 
     case GDK_EXPOSE:
     case GDK_DESTROY:
 
     case GDK_EXPOSE:
+#ifndef __WXGTK3__
     case GDK_NO_EXPOSE:
     case GDK_NO_EXPOSE:
+#endif
     case GDK_MAP:
     case GDK_UNMAP:
 
     case GDK_MAP:
     case GDK_UNMAP:
 
@@ -294,11 +307,19 @@ static void wxgtk_main_do_event(GdkEvent* event, void* data)
     wxGUIEventLoop* evtloop = static_cast<wxGUIEventLoop*>(data);
 
     // is this event allowed now?
     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)
     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)
+    }
 }
 }
 
 }
 }
 
@@ -334,6 +355,11 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
         gtk_main_iteration();
     gdk_event_handler_set ((GdkEventFunc)gtk_main_do_event, NULL, NULL);
 
         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
     if (eventsToProcess != wxEVT_CATEGORY_CLIPBOARD)
     {
         // It's necessary to call ProcessIdle() to update the frames sizes which
@@ -342,7 +368,7 @@ bool wxGUIEventLoop::YieldFor(long eventsToProcess)
         // call ProcessIdle() only once since this is not meant for longish
         // background jobs (controlled by wxIdleEvent::RequestMore() and the
         // return value of Processidle().
         // 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,
     }
     //else: if we are inside ~wxClipboardSync() and we call ProcessIdle() and
     //      the user app contains an UI update handler which calls wxClipboard::IsSupported,