]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
fixes to ShowFullScreen (KDE 3.1)
[wxWidgets.git] / src / motif / window.cpp
index 15a5f5240f27849bdf9e49eafe277504bca4e0bf..4ee8f71d5bbe4f496f16e6781f869b5a10a8ab53 100644 (file)
@@ -45,6 +45,7 @@
 #include "wx/module.h"
 #include "wx/menuitem.h"
 #include "wx/log.h"
+#include "wx/evtloop.h"
 
 #if  wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
@@ -172,17 +173,24 @@ void wxWindow::UnmanageAndDestroy(WXWidget widget)
     }
 }
 
-bool wxWindow::MapOrUnmap(WXWidget widget, bool map)
+bool wxWindow::MapOrUnmap(WXWidget widget, bool domap)
 {
     Widget w = (Widget)widget;
     if ( !w )
         return FALSE;
 
-    if ( map )
+    if ( domap )
         XtMapWidget(w);
     else
         XtUnmapWidget(w);
 
+    //   Rationale: a lot of common operations (including but not
+    // limited to moving, resizing and appending items to a listbox)
+    // unmamange the widget, do their work, then manage it again.
+    // This means that, for example adding an item to a listbox will show it,
+    // or that most controls are shown every time they are moved or resized!
+    XtSetMappedWhenManaged( w, domap );
+
     return TRUE;
 }
 
@@ -954,16 +962,16 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
         GetClientSize(& w, & h);
     }
 
-    wxNode *cnode = m_children.First();
+    wxWindowList::Node *cnode = m_children.GetFirst();
     while (cnode)
     {
-        wxWindow *child = (wxWindow*) cnode->Data();
+        wxWindow *child = cnode->GetData();
         int sx = 0;
         int sy = 0;
         child->GetSize( &sx, &sy );
         wxPoint pos( child->GetPosition() );
         child->SetSize( pos.x + dx, pos.y + dy, sx, sy, wxSIZE_ALLOW_MINUS_ONE );
-        cnode = cnode->Next();
+        cnode = cnode->GetNext();
     }
 
     int x1 = (dx >= 0) ? x : x - dx;
@@ -1072,10 +1080,10 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 
     // Now send expose events
 
-    wxNode* node = updateRects.First();
+    wxList::Node* node = updateRects.GetFirst();
     while (node)
     {
-        wxRect* rect = (wxRect*) node->Data();
+        wxRect* rect = (wxRect*) node->GetData();
         XExposeEvent event;
 
         event.type = Expose;
@@ -1092,17 +1100,17 @@ void wxWindow::ScrollWindow(int dx, int dy, const wxRect *rect)
 
         XSendEvent(display, window, False, ExposureMask, (XEvent *)&event);
 
-        node = node->Next();
+        node = node->GetNext();
 
     }
 
     // Delete the update rects
-    node = updateRects.First();
+    node = updateRects.GetFirst();
     while (node)
     {
-        wxRect* rect = (wxRect*) node->Data();
+        wxRect* rect = (wxRect*) node->GetData();
         delete rect;
-        node = node->Next();
+        node = node->GetNext();
     }
 
     XmUpdateDisplay((Widget) GetMainWidget());
@@ -1144,6 +1152,8 @@ void wxWindow::DoSetToolTip(wxToolTip * WXUNUSED(tooltip))
 // popup menus
 // ----------------------------------------------------------------------------
 
+#if wxUSE_MENUS
+
 bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
 {
     Widget widget = (Widget) GetMainWidget();
@@ -1158,7 +1168,8 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     if (menu->GetParent() && (menu->GetId() != -1))
         return FALSE;
 
-    if (menu->GetMainWidget()) {
+    if (menu->GetMainWidget())
+    {
         menu->DestroyMenu(TRUE);
     }
 
@@ -1207,7 +1218,6 @@ 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
@@ -1215,29 +1225,19 @@ bool wxWindow::DoPopupMenu(wxMenu *menu, int x, int y)
     // 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);
+    wxEventLoop evtLoop;
 
-        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
-            }
-        }
+    while (menu->GetId() == 1)
+    {
+        wxDoEventLoopIteration( evtLoop );
     }
+
     return TRUE;
 }
 
+#endif
+
 // ---------------------------------------------------------------------------
 // moving and resizing
 // ---------------------------------------------------------------------------
@@ -1345,9 +1345,9 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
             y = oldY;
     }
 
-    if ( width == -1 )
+    if ( width <= 0 )
         width = oldW;
-    if ( height == -1 )
+    if ( height <= 0 )
         height = oldH;
 
     bool nothingChanged = (x == oldX) && (y == oldY) &&
@@ -1383,15 +1383,6 @@ void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
 
         if (managed)
             XtManageChild(widget);
-
-        // How about this bit. Maybe we don't need to generate size events
-        // all the time -- they'll be generated when the window is sized anyway.
-#if 0
-        wxSizeEvent sizeEvent(wxSize(width, height), GetId());
-        sizeEvent.SetEventObject(this);
-
-        GetEventHandler()->ProcessEvent(sizeEvent);
-#endif // 0
     }
 }
 
@@ -1720,6 +1711,7 @@ void wxWindow::OnIdle(wxIdleEvent& WXUNUSED(event))
 
 bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
 {
+#if wxUSE_ACCEL
     if (!m_acceleratorTable.Ok())
         return FALSE;
 
@@ -1746,6 +1738,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
             wxFrame* frame = wxDynamicCast(parent, wxFrame);
             if ( frame )
             {
+#if wxUSE_MENUS
                 // Try for a menu command
                 if (frame->GetMenuBar())
                 {
@@ -1760,6 +1753,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
                         return frame->GetEventHandler()->ProcessEvent(commandEvent);
                     }
                 }
+#endif
             }
 
             // Find a child matching the command id
@@ -1781,6 +1775,7 @@ bool wxWindow::ProcessAccelerator(wxKeyEvent& event)
             return FALSE;
         } // matches event
     }// for
+#endif
 
     // We didn't match the key event against an accelerator.
     return FALSE;
@@ -1806,8 +1801,8 @@ bool wxAddWindowToTable(Widget w, wxWindow *win)
 
     wxWidgetHashTable->Put((long) w, win);
 
-    wxLogTrace("widget", "Widget 0x%08x <-> window %p (%s)",
-               w, win, win->GetClassInfo()->GetClassName());
+    wxLogTrace("widget", "Widget 0x%p <-> window %p (%s)",
+               (WXWidget)w, win, win->GetClassInfo()->GetClassName());
 
     return TRUE;
 }
@@ -2986,8 +2981,9 @@ void wxWindow::ChangeFont(bool keepOriginalSize)
         int width, height, width1, height1;
         GetSize(& width, & height);
 
-        // lesstif 0.87 hangs here
-#ifndef LESSTIF_VERSION
+        // lesstif 0.87 hangs here, but 0.93 does not
+#if !defined(LESSTIF_VERSION) \
+    || (defined(LesstifVersion) && LesstifVersion >= 93)
         XtVaSetValues (w,
             XmNfontList, (XmFontList) m_font.GetFontList(1.0, XtDisplay(w)),
             NULL);