]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
detect EOF properly in wxFileInputStream
[wxWidgets.git] / src / motif / window.cpp
index d0a7035d95e80243e073812806ab805a3b8a5106..ccb85596eb6b29449ed8caea2498b323354e5f19 100644 (file)
@@ -817,8 +817,9 @@ int wxWindow::GetScrollRange(int orient) const
     Widget scrollBar = (Widget)GetScrollbar((wxOrientation)orient);
     wxCHECK_MSG( scrollBar, 0, "no such scrollbar" );
 
-    int range;
-    XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
+    int range = 0;
+    if (scrollBar) 
+        XtVaGetValues(scrollBar, XmNmaximum, &range, NULL);
     return range;
 }
 
@@ -1188,6 +1189,34 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     XmMenuPosition (menuWidget, &event);
     XtManageChild (menuWidget);
 
+       XEvent x_event;
+       // The ID of a pop-up menu is 1 when active, and is set to 0 by the
+    // idle-time destroy routine.
+       // Waiting until this ID changes causes this function to block until
+    // the menu has been dismissed and the widgets cleaned up.
+    // In other words, once this routine returns, it is safe to delete
+    // the menu object.
+    // Ian Brown <ian.brown@printsoft.de>
+       while (menu->GetId() == 1)
+    {
+        XtAppNextEvent( (XtAppContext) wxTheApp->GetAppContext(), &x_event);
+
+        wxTheApp->ProcessXEvent((WXEvent*) & x_event);
+
+        if (XtAppPending( (XtAppContext) wxTheApp->GetAppContext() ) == 0)
+        {
+            if (!wxTheApp->ProcessIdle())
+            {
+#if wxUSE_THREADS
+                // leave the main loop to give other threads a chance to
+                // perform their GUI work
+                wxMutexGuiLeave();
+                wxUsleep(20);
+                wxMutexGuiEnter();
+#endif
+            }
+        }
+    }
     return TRUE;
 }
 
@@ -1366,17 +1395,6 @@ wxPoint wxWindow::GetClientAreaOrigin() const
     return wxPoint(0, 0);
 }
 
-// Makes an adjustment to the window position (for example, a frame that has
-// a toolbar that it manages itself).
-void wxWindow::AdjustForParentClientOrigin(int& x, int& y, int sizeFlags)
-{
-    if (((sizeFlags & wxSIZE_NO_ADJUSTMENTS) == 0) && GetParent())
-    {
-        wxPoint pt(GetParent()->GetClientAreaOrigin());
-        x += pt.x; y += pt.y;
-    }
-}
-
 void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, int incH)
 {
     m_minWidth = minW;
@@ -2147,12 +2165,13 @@ static void wxCanvasInputEvent(Widget drawingArea,
     case KeyPress:
         {
             KeySym keySym;
+            static char buf[100];
 #if 0
             XComposeStatus compose;
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, &compose);
+            (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, &compose);
 #endif // 0
 
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
+            (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
             int id = wxCharCodeXToWX (keySym);
 
             wxEventType eventType = wxEVT_CHAR;
@@ -2200,8 +2219,9 @@ static void wxCanvasInputEvent(Widget drawingArea,
         }
     case KeyRelease:
         {
+            static char buf[100];
             KeySym keySym;
-            (void) XLookupString ((XKeyEvent *) & local_event, wxBuffer, 20, &keySym, NULL);
+            (void) XLookupString ((XKeyEvent *) & local_event, buf, 20, &keySym, NULL);
             int id = wxCharCodeXToWX (keySym);
 
             wxKeyEvent event (wxEVT_KEY_UP);