// Author: Julian Smart
// Modified by:
// Created: 17/09/98
-// RCS-ID: $Id$
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
-#ifdef __VMS
-#define XtDisplay XTDISPLAY
-#endif
-
#include "wx/utils.h"
#ifndef WX_PRECOMP
#include "wx/apptrait.h"
#include "wx/evtloop.h"
+#include "wx/private/eventloopsourcesmanager.h"
#include "wx/motif/private/timer.h"
#include <string.h>
#pragma message disable nosimpint
#endif
-#include "wx/unix/execute.h"
-
#include <Xm/Xm.h>
#include <Xm/Frame.h>
}
}
-// ----------------------------------------------------------------------------
-// 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 wxAddProcessCallback(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,
- (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);
+ }
+};
- return (int)id;
+wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager()
+{
+ static wxMotifEventLoopSourcesManager s_eventLoopSourcesManager;
+
+ return &s_eventLoopSourcesManager;
}
+#endif // wxUSE_EVENTLOOP_SOURCE
+
// ----------------------------------------------------------------------------
// 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);
}
-#endif
wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const
{
*height = DisplayHeightMM(dpy, DefaultScreen (dpy));
}
-void wxClientDisplayRect(int *x, int *y, int *width, int *height)
-{
- // This is supposed to return desktop dimensions minus any window
- // manager panels, menus, taskbars, etc. If there is a way to do that
- // for this platform please fix this function, otherwise it defaults
- // to the entire desktop.
- if (x) *x = 0;
- if (y) *y = 0;
- wxDisplaySize(width, height);
-}
-
-
// Configurable display in wxX11 and wxMotif
static WXDisplay *gs_currentDisplay = NULL;
static wxString gs_displayName;
{
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);
}
}
-#ifdef __WXDEBUG__
wxString wxGetXEventName(XEvent& event)
{
#if wxUSE_NANOX
return str;
#endif
}
-#endif
// ----------------------------------------------------------------------------
// accelerators
// 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
void wxDoChangeBackgroundColour(WXWidget widget, const wxColour& backgroundColour, bool changeArmColour)
{
- if (!backgroundColour.Ok())
+ if (!backgroundColour.IsOk())
return;
wxComputeColours (XtDisplay((Widget) widget), & backgroundColour,
- (wxColour*) NULL);
+ NULL);
XtVaSetValues ((Widget) widget,
XmNbackground, g_itemColors[wxBACK_INDEX].pixel,
NULL
);
}
- else if (style & wxSUNKEN_BORDER)
+ else if ((style & wxSUNKEN_BORDER) || (style & wxBORDER_THEME))
{
borderWidget = XtVaCreateManagedWidget
(