Only give capture to wxPopupTransientWindow child if it's the only one.
[wxWidgets.git] / src / motif / utils.cpp
index 4a94ff07343aa981f8562ea6b1a82a5ba9fa32bd..4700c3c329e60f9ee3fd749db9e44809ae74a49e 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Julian Smart
 // Modified by:
 // Created:     17/09/98
 // Author:      Julian Smart
 // Modified by:
 // Created:     17/09/98
-// RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 // Copyright:   (c) Julian Smart
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -30,6 +29,7 @@
 
 #include "wx/apptrait.h"
 #include "wx/evtloop.h"
 
 #include "wx/apptrait.h"
 #include "wx/evtloop.h"
+#include "wx/private/eventloopsourcesmanager.h"
 #include "wx/motif/private/timer.h"
 
 #include <string.h>
 #include "wx/motif/private/timer.h"
 
 #include <string.h>
@@ -42,8 +42,6 @@
 #pragma message disable nosimpint
 #endif
 
 #pragma message disable nosimpint
 #endif
 
-#include "wx/unix/execute.h"
-
 #include <Xm/Xm.h>
 #include <Xm/Frame.h>
 
 #include <Xm/Xm.h>
 #include <Xm/Frame.h>
 
@@ -79,47 +77,104 @@ void wxFlushEvents(WXDisplay* wxdisplay)
     }
 }
 
     }
 }
 
-// ----------------------------------------------------------------------------
-// wxExecute stuff
-// ----------------------------------------------------------------------------
+#if wxUSE_EVENTLOOP_SOURCE
 
 
-static void xt_notify_end_process(XtPointer data, int *WXUNUSED(fid),
-                                  XtInputId *id)
+extern "C"
 {
 {
-    wxEndProcessData *proc_data = (wxEndProcessData *)data;
 
 
-    wxHandleProcessTermination(proc_data);
+static
+void
+wxMotifInputHandler(XtPointer data,
+                    int* WXUNUSED(fd),
+                    XtInputId* WXUNUSED(inputId))
+{
+    wxEventLoopSourceHandler * const
+        handler = static_cast<wxEventLoopSourceHandler *>(data);
 
 
-    // VZ: I think they should be the same...
-    wxASSERT( (int)*id == proc_data->tag );
+    handler->OnReadWaiting();
+}
 
 
-    XtRemoveInput(*id);
 }
 
 }
 
-int wxGUIAppTraits::AddProcessCallback(wxEndProcessData *proc_data, int fd)
+// This class exists just to call XtRemoveInput() in its dtor, the real work of
+// dispatching events on the file descriptor to the handler is done by
+// wxMotifInputHandler callback above.
+class wxMotifEventLoopSource : public wxEventLoopSource
+{
+public:
+    wxMotifEventLoopSource(XtInputId inputId,
+                           wxEventLoopSourceHandler *handler,
+                           int flags)
+        : wxEventLoopSource(handler, flags),
+          m_inputId(inputId)
+    {
+    }
+
+    virtual ~wxMotifEventLoopSource()
+    {
+        XtRemoveInput(m_inputId);
+    }
+
+private:
+    const XtInputId m_inputId;
+
+    wxDECLARE_NO_COPY_CLASS(wxMotifEventLoopSource);
+};
+
+class wxMotifEventLoopSourcesManager : public wxEventLoopSourcesManagerBase
 {
 {
-    XtInputId id = XtAppAddInput((XtAppContext) wxTheApp->GetAppContext(),
+public:
+    wxEventLoopSource *
+    AddSourceForFD(int fd, wxEventLoopSourceHandler* handler, int flags)
+    {
+        wxCHECK_MSG( wxTheApp, NULL, "Must create wxTheApp first" );
+
+        // The XtInputXXXMask values cannot be combined (hence "Mask" is a
+        // complete misnomer), and supporting those would make the code more
+        // complicated and we don't need them for now.
+        wxCHECK_MSG( !(flags & (wxEVENT_SOURCE_OUTPUT |
+                                wxEVENT_SOURCE_EXCEPTION)),
+                     NULL,
+                     "Monitoring FDs for output/errors not supported" );
+
+        wxCHECK_MSG( flags & wxEVENT_SOURCE_INPUT,
+                     NULL,
+                     "Should be monitoring for input" );
+
+        XtInputId inputId = XtAppAddInput
+                            (
+                                 (XtAppContext) wxTheApp->GetAppContext(),
                                  fd,
                                  fd,
-                                 (XtPointer *) XtInputReadMask,
-                                 (XtInputCallbackProc) xt_notify_end_process,
-                                 (XtPointer) proc_data);
+                                 (XtPointer) XtInputReadMask,
+                                 wxMotifInputHandler,
+                                 handler
+                            );
+        if ( inputId < 0 )
+            return 0;
+
+        return new wxMotifEventLoopSource(inputId, handler, flags);
+    }
+};
+
+wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager()
+{
+    static wxMotifEventLoopSourcesManager s_eventLoopSourcesManager;
 
 
-    return (int)id;
+    return &s_eventLoopSourcesManager;
 }
 
 }
 
+#endif // wxUSE_EVENTLOOP_SOURCE
+
 // ----------------------------------------------------------------------------
 // misc
 // ----------------------------------------------------------------------------
 
 // Emit a beeeeeep
 // ----------------------------------------------------------------------------
 // misc
 // ----------------------------------------------------------------------------
 
 // Emit a beeeeeep
-#ifndef __EMX__
-// on OS/2, we use the wxBell from wxBase library (src/os2/utils.cpp)
 void wxBell()
 {
     // Use current setting for the bell
     XBell (wxGlobalDisplay(), 0);
 }
 void wxBell()
 {
     // Use current setting for the bell
     XBell (wxGlobalDisplay(), 0);
 }
-#endif
 
 wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
 {
 
 wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
 {
@@ -370,7 +425,7 @@ void wxAllocColor(Display *d,Colormap cmp,XColor *xc)
 {
     if (!XAllocColor(d,cmp,xc))
     {
 {
     if (!XAllocColor(d,cmp,xc))
     {
-        //          cout << "wxAllocColor : Warning : Can not allocate color, attempt find nearest !\n";
+        //          cout << "wxAllocColor : Warning : cannot allocate color, attempt find nearest !\n";
         wxAllocNearestColor(d,cmp,xc);
     }
 }
         wxAllocNearestColor(d,cmp,xc);
     }
 }
@@ -517,7 +572,7 @@ XmString wxFindAcceleratorText (const char *s)
 // Change a widget's foreground and background colours.
 void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
 {
 // Change a widget's foreground and background colours.
 void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
 {
-    if (!foregroundColour.Ok())
+    if (!foregroundColour.IsOk())
         return;
 
     // When should we specify the foreground, if it's calculated
         return;
 
     // When should we specify the foreground, if it's calculated
@@ -536,7 +591,7 @@ void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour)
 
 void wxDoChangeBackgroundColour(WXWidget widget, const wxColour& backgroundColour, bool changeArmColour)
 {
 
 void wxDoChangeBackgroundColour(WXWidget widget, const wxColour& backgroundColour, bool changeArmColour)
 {
-    if (!backgroundColour.Ok())
+    if (!backgroundColour.IsOk())
         return;
 
     wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
         return;
 
     wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,