Implement monitoring of file descriptors in wxMotif event loop.
This allows applications using wxMotif to link again after the changes of r74350 -- and wxExecute() unit tests actually pass, too. Closes #15305. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74480 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
72c5855f5c
commit
38534f5969
@ -30,6 +30,7 @@
|
||||
|
||||
#include "wx/apptrait.h"
|
||||
#include "wx/evtloop.h"
|
||||
#include "wx/private/eventloopsourcesmanager.h"
|
||||
#include "wx/motif/private/timer.h"
|
||||
|
||||
#include <string.h>
|
||||
@ -77,6 +78,94 @@ void wxFlushEvents(WXDisplay* wxdisplay)
|
||||
}
|
||||
}
|
||||
|
||||
#if wxUSE_EVENTLOOP_SOURCE
|
||||
|
||||
extern "C"
|
||||
{
|
||||
|
||||
static
|
||||
void
|
||||
wxMotifInputHandler(XtPointer data,
|
||||
int* WXUNUSED(fd),
|
||||
XtInputId* WXUNUSED(inputId))
|
||||
{
|
||||
wxEventLoopSourceHandler * const
|
||||
handler = static_cast<wxEventLoopSourceHandler *>(data);
|
||||
|
||||
handler->OnReadWaiting();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 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
|
||||
{
|
||||
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,
|
||||
(XtPointer) XtInputReadMask,
|
||||
wxMotifInputHandler,
|
||||
handler
|
||||
);
|
||||
if ( inputId < 0 )
|
||||
return 0;
|
||||
|
||||
return new wxMotifEventLoopSource(inputId, handler, flags);
|
||||
}
|
||||
};
|
||||
|
||||
wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager()
|
||||
{
|
||||
static wxMotifEventLoopSourcesManager s_eventLoopSourcesManager;
|
||||
|
||||
return &s_eventLoopSourcesManager;
|
||||
}
|
||||
|
||||
#endif // wxUSE_EVENTLOOP_SOURCE
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// misc
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user