]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/utils.cpp
added and documented wxDir::HasFiles/SubDirs(), use the latter in wxDirDialog - it...
[wxWidgets.git] / src / motif / utils.cpp
index e981f6e89daca5df03293110dfb91c3de1bab64d..9f6ed67e35324661f01c31c2ea15611c891a352c 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
+#ifdef __VMS
+#define XtDisplay XTDISPLAY
+#endif
+
 #include "wx/setup.h"
 #include "wx/utils.h"
 #include "wx/app.h"
 #include "wx/msgdlg.h"
 #include "wx/cursor.h"
+#include "wx/window.h" // for wxTopLevelWindows
 
 #include <ctype.h>
 #include <stdarg.h>
     #include <sysent.h>
 #endif
 
+#ifdef __VMS__
+#pragma message disable nosimpint
+#endif
 #include <Xm/Xm.h>
+#ifdef __VMS__
+#pragma message enable nosimpint
+#endif
+
+#include "wx/unix/execute.h"
 
 #include "wx/motif/private.h"
 
@@ -58,8 +71,6 @@
 
 static char *GetIniFile (char *dest, const char *filename);
 
-extern wxList wxTopLevelWindows;
-
 // ============================================================================
 // implementation
 // ============================================================================
@@ -74,7 +85,7 @@ void wxFlushEvents()
     Display *display = (Display*) wxGetDisplay();
 
     XSync (display, FALSE);
-    XEvent event;
+
     // 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.
@@ -122,7 +133,7 @@ bool wxCheckForInterrupt(wxWindow *wnd)
 // wxExecute stuff
 // ----------------------------------------------------------------------------
 
-static void xt_notify_end_process(XtPointer client, int *fid,
+static void xt_notify_end_process(XtPointer data, int *WXUNUSED(fid),
                                   XtInputId *id)
 {
     wxEndProcessData *proc_data = (wxEndProcessData *)data;
@@ -141,7 +152,7 @@ int wxAddProcessCallback(wxEndProcessData *proc_data, int fd)
                                  fd,
                                  (XtPointer *) XtInputReadMask,
                                  (XtInputCallbackProc) xt_notify_end_process,
-                                 (XtPointer) process_data);
+                                 (XtPointer) proc_data);
 
     return (int)id;
 }
@@ -461,11 +472,9 @@ void wxXMergeDatabases (wxApp * theApp, Display * display)
         size_t len;
         environment = GetIniFile (filename, NULL);
         len = strlen (environment);
-#if defined(__SOLARIS__) || defined(__SVR4__) && !defined(__HPUX__)
-        (void) sysinfo (SI_HOSTNAME, environment + len, 1024 - len);
-#else
-        (void) gethostname (environment + len, 1024 - len);
-#endif
+        wxString hostname = wxGetHostName();
+        if ( !!hostname )
+            strncat(environment, hostname, 1024 - len);
     }
     homeDB = XrmGetFileDatabase (environment);
     XrmMergeDatabases (homeDB, &wxResourceDatabase);
@@ -542,8 +551,8 @@ wxXSetBusyCursor (wxWindow * win, wxCursor * cursor)
     else
     {
         // Restore old cursor
-        if (win->GetCursor()->Ok())
-            attrs.cursor = (Cursor) win->GetCursor()->GetXCursor(display);
+        if (win->GetCursor().Ok())
+            attrs.cursor = (Cursor) win->GetCursor().GetXCursor(display);
         else
             attrs.cursor = None;
     }
@@ -639,6 +648,28 @@ void wxDisplaySize(int *width, int *height)
         *height = DisplayHeight (dpy, DefaultScreen (dpy));
 }
 
+void wxDisplaySizeMM(int *width, int *height)
+{
+    Display *dpy = (Display*) wxGetDisplay();
+
+    if ( width )
+        *width = DisplayWidthMM(dpy, DefaultScreen (dpy));
+    if ( 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 Motif
 static WXDisplay *gs_currentDisplay = NULL;
 static wxString gs_displayName;
@@ -690,8 +721,6 @@ bool wxSetDisplay(const wxString& display_name)
         else
             return FALSE;
     }
-
-    return FALSE;
 }
 
 wxString wxGetDisplayName()
@@ -699,6 +728,11 @@ wxString wxGetDisplayName()
     return gs_displayName;
 }
 
+wxWindow* wxFindWindowAtPoint(const wxPoint& pt)
+{
+    return wxGenericFindWindowAtPoint(pt);
+}
+
 // ----------------------------------------------------------------------------
 // accelerators
 // ----------------------------------------------------------------------------
@@ -726,9 +760,14 @@ char wxFindMnemonic (const char *s)
     return mnem;
 }
 
-char * wxFindAccelerator (char *s)
+char * wxFindAccelerator (const char *s)
 {
-    // The accelerator text is after the \t char.
+    // 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')
@@ -749,7 +788,7 @@ char * wxFindAccelerator (char *s)
     wxBuffer[0] = '\0';
     char *tmp = copystring (s);
     s = tmp;
-    char *p = s;
+    char *p = tmp;
 
     while (1)
     {
@@ -764,8 +803,7 @@ char * wxFindAccelerator (char *s)
                 strcat (wxBuffer, s);
             else
                 strcat (wxBuffer, "Meta");
-            s = p + 1;
-            p = s;
+            s = p++;
         }
         else
         {
@@ -776,18 +814,25 @@ char * wxFindAccelerator (char *s)
     }
     delete[]tmp;
     return wxBuffer;
+#endif
 }
 
-XmString wxFindAcceleratorText (char *s)
+XmString wxFindAcceleratorText (const char *s)
 {
-    // The accelerator text is after the \t char.
+    // 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 (s);
+    XmString text = XmStringCreateSimple ((char *)s);
     return text;
+#endif
 }
 
 // ----------------------------------------------------------------------------
@@ -1042,7 +1087,7 @@ void wxHSVToXColor(wxHSV *hsv,XColor *rgb)
     int h = hsv->h;
     int s = hsv->s;
     int v = hsv->v;
-    int r, g, b;
+    int r = 0, g = 0, b = 0;
     int i, f;
     int p, q, t;
     s = (s * wxMAX_RGB) / wxMAX_SV;
@@ -1075,14 +1120,14 @@ void wxXColorToHSV(wxHSV *hsv,XColor *rgb)
     int b = rgb->blue >> 8;
     int maxv = wxMax3(r, g, b);
     int minv = wxMin3(r, g, b);
-    int h, s, v;
+    int h = 0, s, v;
     v = maxv;
     if (maxv) s = (maxv - minv) * wxMAX_RGB / maxv;
     else s = 0;
     if (s == 0) h = 0;
     else
     {
-        int rc, gc, bc, hex;
+        int rc, gc, bc, hex = 0;
         rc = (maxv - r) * wxMAX_RGB / (maxv - minv);
         gc = (maxv - g) * wxMAX_RGB / (maxv - minv);
         bc = (maxv - b) * wxMAX_RGB / (maxv - minv);
@@ -1111,7 +1156,7 @@ void wxAllocNearestColor(Display *d,Colormap cmp,XColor *xc)
     wxHSV hsv_defs, hsv;
     wxXColorToHSV(&hsv,xc);
 
-    int diff, min_diff, pixel = 0;
+    int diff, min_diff = 0, pixel = 0;
 
     for(llp = 0;llp < num_colors;llp++)
     {
@@ -1128,8 +1173,11 @@ void wxAllocNearestColor(Display *d,Colormap cmp,XColor *xc)
     xc -> green = color_defs[pixel].green;
     xc -> blue = color_defs[pixel].blue;
     xc -> flags = DoRed | DoGreen | DoBlue;
+
+/*  FIXME, TODO
     if (!XAllocColor(d,cmp,xc))
         cout << "wxAllocNearestColor : Warning : Cannot find nearest color !\n";
+*/
 
     delete[] color_defs;
 }