X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b46b1d59d6f69ad80dcf5955375578a6504d100a..0d1903dbda864780eec30efdc4e91776bdbfd21b:/src/motif/utils.cpp diff --git a/src/motif/utils.cpp b/src/motif/utils.cpp index e6309b2e51..4700c3c329 100644 --- a/src/motif/utils.cpp +++ b/src/motif/utils.cpp @@ -4,7 +4,6 @@ // Author: Julian Smart // Modified by: // Created: 17/09/98 -// RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -20,10 +19,6 @@ // 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 @@ -34,6 +29,7 @@ #include "wx/apptrait.h" #include "wx/evtloop.h" +#include "wx/private/eventloopsourcesmanager.h" #include "wx/motif/private/timer.h" #include @@ -46,8 +42,6 @@ #pragma message disable nosimpint #endif -#include "wx/unix/execute.h" - #include #include @@ -83,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(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); + } +}; + +wxEventLoopSourcesManagerBase* wxGUIAppTraits::GetEventLoopSourcesManager() +{ + static wxMotifEventLoopSourcesManager s_eventLoopSourcesManager; - return (int)id; + 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 { @@ -136,7 +187,7 @@ wxPortId wxGUIAppTraits::GetToolkitVersion(int *verMaj, int *verMin) const return wxPORT_MOTIF; } -wxEventLoop* wxGUIAppTraits::CreateEventLoop() +wxEventLoopBase* wxGUIAppTraits::CreateEventLoop() { return new wxEventLoop; } @@ -205,18 +256,6 @@ void wxDisplaySizeMM(int *width, int *height) *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; @@ -386,12 +425,11 @@ void wxAllocColor(Display *d,Colormap cmp,XColor *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); } } -#ifdef __WXDEBUG__ wxString wxGetXEventName(XEvent& event) { #if wxUSE_NANOX @@ -417,7 +455,6 @@ wxString wxGetXEventName(XEvent& event) return str; #endif } -#endif // ---------------------------------------------------------------------------- // accelerators @@ -535,7 +572,7 @@ XmString wxFindAcceleratorText (const char *s) // 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 @@ -554,11 +591,11 @@ void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour) 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, @@ -601,11 +638,6 @@ wxString wxXmStringToString( const XmString& xmString ) return wxEmptyString; } -XmString wxStringToXmString( const wxString& str ) -{ - return wxStringToXmString(str.mb_str()); -} - XmString wxStringToXmString( const char* str ) { return XmStringCreateLtoR((char *)str, XmSTRING_DEFAULT_CHARSET); @@ -656,7 +688,7 @@ WXWidget wxCreateBorderWidget( WXWidget parent, long style ) NULL ); } - else if (style & wxSUNKEN_BORDER) + else if ((style & wxSUNKEN_BORDER) || (style & wxBORDER_THEME)) { borderWidget = XtVaCreateManagedWidget (