X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/83df96d63a52ebb08b9e32549dc255354b4a18d0..2db991f4576e7b08e4aa877c6350cca9656a60cc:/src/x11/utils.cpp?ds=sidebyside diff --git a/src/x11/utils.cpp b/src/x11/utils.cpp index 9f6ed67e35..fc15ff0ce1 100644 --- a/src/x11/utils.cpp +++ b/src/x11/utils.cpp @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __VMS -#define XtDisplay XTDISPLAY -#endif - #include "wx/setup.h" #include "wx/utils.h" #include "wx/app.h" @@ -48,14 +44,27 @@ #ifdef __VMS__ #pragma message disable nosimpint #endif -#include -#ifdef __VMS__ -#pragma message enable nosimpint -#endif #include "wx/unix/execute.h" +#ifdef __WXMOTIF__ +#include #include "wx/motif/private.h" +#endif + +#ifdef __WXX11__ +#include "wx/x11/private.h" +#endif + +#if wxUSE_RESOURCES +#include "X11/Xresource.h" +#endif + +#include "X11/Xutil.h" + +#ifdef __VMS__ +#pragma message enable nosimpint +#endif // ---------------------------------------------------------------------------- // private functions @@ -86,6 +95,7 @@ void wxFlushEvents() XSync (display, FALSE); +#ifdef __WXMOTIF__ // XtAppPending returns availability of events AND timers/inputs, which // are processed via callbacks, so XtAppNextEvent will not return if // there are no events. So added '& XtIMXEvent' - Sergey. @@ -95,12 +105,18 @@ void wxFlushEvents() // Jan Lessner: works better when events are non-X events XtAppProcessEvent((XtAppContext) wxTheApp->GetAppContext(), XtIMXEvent); } +#endif +#ifdef __WXX11__ + // TODO for X11 + // ?? +#endif } // Check whether this window wants to process messages, e.g. Stop button // in long calculations. bool wxCheckForInterrupt(wxWindow *wnd) { +#ifdef __WXMOTIF__ wxCHECK_MSG( wnd, FALSE, "NULL window in wxCheckForInterrupt" ); Display *dpy=(Display*) wnd->GetXDisplay(); @@ -127,12 +143,16 @@ bool wxCheckForInterrupt(wxWindow *wnd) } return hadEvents; +#else + wxASSERT_MSG(FALSE, "wxCheckForInterrupt not yet implemented."); + return FALSE; +#endif } // ---------------------------------------------------------------------------- // wxExecute stuff // ---------------------------------------------------------------------------- - +#ifdef __WXMOTIF__ static void xt_notify_end_process(XtPointer data, int *WXUNUSED(fid), XtInputId *id) { @@ -145,9 +165,11 @@ static void xt_notify_end_process(XtPointer data, int *WXUNUSED(fid), XtRemoveInput(*id); } +#endif int wxAddProcessCallback(wxEndProcessData *proc_data, int fd) { +#ifdef __WXMOTIF__ XtInputId id = XtAppAddInput((XtAppContext) wxTheApp->GetAppContext(), fd, (XtPointer *) XtInputReadMask, @@ -155,6 +177,11 @@ int wxAddProcessCallback(wxEndProcessData *proc_data, int fd) (XtPointer) proc_data); return (int)id; +#endif +#ifdef __WXX11__ + // TODO + return 0; +#endif } // ---------------------------------------------------------------------------- @@ -170,6 +197,7 @@ void wxBell() int wxGetOsVersion(int *majorVsn, int *minorVsn) { +#ifdef __WXMOTIF__ // FIXME TODO // This code is WRONG!! Does NOT return the // Motif version of the libs but the X protocol @@ -181,6 +209,14 @@ int wxGetOsVersion(int *majorVsn, int *minorVsn) *minorVsn = ProtocolRevision (display); return wxMOTIF_X; +#endif +#ifdef __WXX11__ + if (majorVsn) + *majorVsn = 0; + if (minorVsn) + *minorVsn = 0; + return wxX11; +#endif } // ---------------------------------------------------------------------------- @@ -526,91 +562,17 @@ wxSetDefaultResources (const Widget w, const char **resourceSpec, const char *na #endif // wxUSE_RESOURCES -// ---------------------------------------------------------------------------- -// busy cursor stuff -// ---------------------------------------------------------------------------- - -static int wxBusyCursorCount = 0; - -// Helper function -static void -wxXSetBusyCursor (wxWindow * win, wxCursor * cursor) -{ - Display *display = (Display*) win->GetXDisplay(); - - Window xwin = (Window) win->GetXWindow(); - if (!xwin) - return; - - XSetWindowAttributes attrs; - - if (cursor) - { - attrs.cursor = (Cursor) cursor->GetXCursor(display); - } - else - { - // Restore old cursor - if (win->GetCursor().Ok()) - attrs.cursor = (Cursor) win->GetCursor().GetXCursor(display); - else - attrs.cursor = None; - } - if (xwin) - XChangeWindowAttributes (display, xwin, CWCursor, &attrs); - - XFlush (display); - - for(wxNode *node = win->GetChildren().First (); node; node = node->Next()) - { - wxWindow *child = (wxWindow *) node->Data (); - wxXSetBusyCursor (child, cursor); - } -} - -// Set the cursor to the busy cursor for all windows -void wxBeginBusyCursor(wxCursor *cursor) -{ - wxBusyCursorCount++; - if (wxBusyCursorCount == 1) - { - for(wxNode *node = wxTopLevelWindows.First (); node; node = node->Next()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxXSetBusyCursor (win, cursor); - } - } -} - -// Restore cursor to normal -void wxEndBusyCursor() -{ - if (wxBusyCursorCount == 0) - return; - - wxBusyCursorCount--; - if (wxBusyCursorCount == 0) - { - for(wxNode *node = wxTopLevelWindows.First (); node; node = node->Next()) - { - wxWindow *win = (wxWindow *) node->Data (); - wxXSetBusyCursor (win, NULL); - } - } -} - -// TRUE if we're between the above two calls -bool wxIsBusy() -{ - return (wxBusyCursorCount > 0); -} - // ---------------------------------------------------------------------------- // display info // ---------------------------------------------------------------------------- void wxGetMousePosition( int* x, int* y ) { +#if wxUSE_NANOX + // TODO + *x = 0; + *y = 0; +#else XMotionEvent xev; Window root, child; XQueryPointer((Display*) wxGetDisplay(), @@ -621,6 +583,7 @@ void wxGetMousePosition( int* x, int* y ) &(xev.state)); *x = xev.x_root; *y = xev.y_root; +#endif }; // Return TRUE if we have a colour display @@ -670,7 +633,7 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) } -// Configurable display in Motif +// Configurable display in wxX11 and wxMotif static WXDisplay *gs_currentDisplay = NULL; static wxString gs_displayName; @@ -678,20 +641,23 @@ WXDisplay *wxGetDisplay() { if (gs_currentDisplay) return gs_currentDisplay; - +#ifdef __WXMOTIF__ if (wxTheApp && wxTheApp->GetTopLevelWidget()) return XtDisplay ((Widget) wxTheApp->GetTopLevelWidget()); else if (wxTheApp) return wxTheApp->GetInitialDisplay(); - else - return (WXDisplay*) NULL; + return NULL; +#endif +#ifdef __WXX11__ + return wxApp::GetDisplay(); +#endif } bool wxSetDisplay(const wxString& display_name) { gs_displayName = display_name; - if ( !display_name ) + if ( display_name.IsEmpty() ) { gs_currentDisplay = NULL; @@ -699,6 +665,7 @@ bool wxSetDisplay(const wxString& display_name) } else { +#ifdef __WXMOTIF__ Cardinal argc = 0; Display *display = XtOpenDisplay((XtAppContext) wxTheApp->GetAppContext(), @@ -720,6 +687,18 @@ bool wxSetDisplay(const wxString& display_name) } else return FALSE; +#endif +#ifdef __WXX11__ + Display* display = XOpenDisplay((char*) display_name.c_str()); + + if (display) + { + gs_currentDisplay = (WXDisplay*) display; + return TRUE; + } + else + return FALSE; +#endif } } @@ -733,108 +712,6 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) return wxGenericFindWindowAtPoint(pt); } -// ---------------------------------------------------------------------------- -// accelerators -// ---------------------------------------------------------------------------- - -// Find the letter corresponding to the mnemonic, for Motif -char wxFindMnemonic (const char *s) -{ - char mnem = 0; - int len = strlen (s); - int i; - for (i = 0; i < len; i++) - { - if (s[i] == '&') - { - // Carefully handle && - if ((i + 1) <= len && s[i + 1] == '&') - i++; - else - { - mnem = s[i + 1]; - break; - } - } - } - return mnem; -} - -char * wxFindAccelerator (const char *s) -{ - // VZ: this function returns incorrect keysym which completely breaks kbd - // handling - return NULL; - -#if 0 - // The accelerator text is after the \t char. - while (*s && *s != '\t') - s++; - if (*s == '\0') - return (NULL); - s++; - /* - Now we need to format it as X standard: - - input output - - F7 --> F7 - Ctrl+N --> CtrlN - Alt+k --> Metak - Ctrl+Shift+A --> Ctrl ShiftA - - */ - - wxBuffer[0] = '\0'; - char *tmp = copystring (s); - s = tmp; - char *p = tmp; - - while (1) - { - while (*p && *p != '+') - p++; - if (*p) - { - *p = '\0'; - if (wxBuffer[0]) - strcat (wxBuffer, " "); - if (strcmp (s, "Alt")) - strcat (wxBuffer, s); - else - strcat (wxBuffer, "Meta"); - s = p++; - } - else - { - strcat (wxBuffer, ""); - strcat (wxBuffer, s); - break; - } - } - delete[]tmp; - return wxBuffer; -#endif -} - -XmString wxFindAcceleratorText (const char *s) -{ - // VZ: this function returns incorrect keysym which completely breaks kbd - // handling - return NULL; - -#if 0 - // The accelerator text is after the \t char. - while (*s && *s != '\t') - s++; - if (*s == '\0') - return (NULL); - s++; - XmString text = XmStringCreateSimple ((char *)s); - return text; -#endif -} - // ---------------------------------------------------------------------------- // keycode translations // ---------------------------------------------------------------------------- @@ -1144,6 +1021,7 @@ void wxXColorToHSV(wxHSV *hsv,XColor *rgb) void wxAllocNearestColor(Display *d,Colormap cmp,XColor *xc) { +#if !wxUSE_NANOX int llp; int screen = DefaultScreen(d); @@ -1180,6 +1058,7 @@ void wxAllocNearestColor(Display *d,Colormap cmp,XColor *xc) */ delete[] color_defs; +#endif } void wxAllocColor(Display *d,Colormap cmp,XColor *xc) @@ -1191,6 +1070,138 @@ void wxAllocColor(Display *d,Colormap cmp,XColor *xc) } } +#ifdef __WXDEBUG__ +wxString wxGetXEventName(XEvent& event) +{ +#if wxUSE_NANOX + wxString str(wxT("(some event)")); + return str; +#else + int type = event.xany.type; + static char* event_name[] = { + "", "unknown(-)", // 0-1 + "KeyPress", "KeyRelease", "ButtonPress", "ButtonRelease", // 2-5 + "MotionNotify", "EnterNotify", "LeaveNotify", "FocusIn", // 6-9 + "FocusOut", "KeymapNotify", "Expose", "GraphicsExpose", // 10-13 + "NoExpose", "VisibilityNotify", "CreateNotify", // 14-16 + "DestroyNotify", "UnmapNotify", "MapNotify", "MapRequest",// 17-20 + "ReparentNotify", "ConfigureNotify", "ConfigureRequest", // 21-23 + "GravityNotify", "ResizeRequest", "CirculateNotify", // 24-26 + "CirculateRequest", "PropertyNotify", "SelectionClear", // 27-29 + "SelectionRequest", "SelectionNotify", "ColormapNotify", // 30-32 + "ClientMessage", "MappingNotify", // 33-34 + "unknown(+)"}; // 35 + type = wxMin(35, type); type = wxMax(1, type); + wxString str(event_name[type]); + return str; +#endif +} +#endif + +#ifdef __WXMOTIF__ +// ---------------------------------------------------------------------------- +// accelerators +// ---------------------------------------------------------------------------- + +// Find the letter corresponding to the mnemonic, for Motif +char wxFindMnemonic (const char *s) +{ + char mnem = 0; + int len = strlen (s); + int i; + for (i = 0; i < len; i++) + { + if (s[i] == '&') + { + // Carefully handle && + if ((i + 1) <= len && s[i + 1] == '&') + i++; + else + { + mnem = s[i + 1]; + break; + } + } + } + return mnem; +} + +char * wxFindAccelerator (const char *s) +{ + // VZ: this function returns incorrect keysym which completely breaks kbd + // handling + return NULL; + +#if 0 + // The accelerator text is after the \t char. + while (*s && *s != '\t') + s++; + if (*s == '\0') + return (NULL); + s++; + /* + Now we need to format it as X standard: + + input output + + F7 --> F7 + Ctrl+N --> CtrlN + Alt+k --> Metak + Ctrl+Shift+A --> Ctrl ShiftA + + */ + + static char buf[256]; + buf[0] = '\0'; + char *tmp = copystring (s); + s = tmp; + char *p = tmp; + + while (1) + { + while (*p && *p != '+') + p++; + if (*p) + { + *p = '\0'; + if (buf[0]) + strcat (buf, " "); + if (strcmp (s, "Alt")) + strcat (buf, s); + else + strcat (buf, "Meta"); + s = p++; + } + else + { + strcat (buf, ""); + strcat (buf, s); + break; + } + } + delete[]tmp; + return buf; +#endif +} + +XmString wxFindAcceleratorText (const char *s) +{ + // VZ: this function returns incorrect keysym which completely breaks kbd + // handling + return NULL; + +#if 0 + // The accelerator text is after the \t char. + while (*s && *s != '\t') + s++; + if (*s == '\0') + return (NULL); + s++; + XmString text = XmStringCreateSimple ((char *)s); + return text; +#endif +} + // These functions duplicate those in wxWindow, but are needed // for use outside of wxWindow (e.g. wxMenu, wxMenuBar). @@ -1231,3 +1242,13 @@ void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, boo NULL); } +#endif + // __WXMOTIF__ + +bool wxWindowIsVisible(Window win) +{ + XWindowAttributes wa; + XGetWindowAttributes(wxGlobalDisplay(), win, &wa); + + return (wa.map_state == IsViewable); +}