]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/toplevel.cpp
byte length for interim UniChar String corrected
[wxWidgets.git] / src / motif / toplevel.cpp
index 6d1b385573c2aa5829bf09bce1951da83c748b77..d99fa360b0bcd24b140b248f83d991c3347cfb1a 100644 (file)
@@ -17,7 +17,7 @@
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(__APPLE__)
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "toplevel.h"
 #endif
 
@@ -64,10 +64,8 @@ static void wxTLWEventHandler( Widget wid,
 // wxTopLevelWindowMotif implementation
 // ===========================================================================
 
-wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
+void wxTopLevelWindowMotif::PreDestroy()
 {
-    wxTopLevelWindows.DeleteObject(this);
-
     if ( (GetWindowStyleFlag() & wxDIALOG_MODAL) != wxDIALOG_MODAL )
         wxModelessWindows.DeleteObject(this);
 
@@ -85,21 +83,11 @@ wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
                               wxTLWEventHandler,
                               (XtPointer)this );
     }
+}
 
-    DoDestroy();
-
+wxTopLevelWindowMotif::~wxTopLevelWindowMotif()
+{
     SetMainWidget( (WXWidget)0 );
-
-    // If this is the last top-level window, exit.
-    if (wxTheApp && (wxTopLevelWindows.GetCount() == 0))
-    {
-        wxTheApp->SetTopWindow(NULL);
-
-        if (wxTheApp->GetExitOnFrameDelete())
-        {
-            wxTheApp->ExitMainLoop();
-        }
-    }
 }
 
 void wxTopLevelWindowMotif::Init()
@@ -197,6 +185,29 @@ bool wxTopLevelWindowMotif::Create( wxWindow *parent, wxWindowID id,
     return retval;
 }
 
+void wxTopLevelWindowMotif::DoGetPosition(int *x, int *y) const
+{
+    Widget top = (Widget) GetTopWidget();
+    Window parent_window = XtWindow((Widget) top),
+        next_parent   = XtWindow((Widget) top),
+        root          = RootWindowOfScreen(XtScreen((Widget) top));
+
+    // search for the parent that is child of ROOT, because the WM may
+    // reparent twice and notify only the next parent (like FVWM)
+    while (next_parent != root) {
+        Window *theChildren; unsigned int n;
+        parent_window = next_parent;
+        XQueryTree(XtDisplay((Widget) top), parent_window, &root,
+            &next_parent, &theChildren, &n);
+        XFree(theChildren); // not needed
+    }
+    int xx, yy; unsigned int dummy;
+    XGetGeometry(XtDisplay((Widget) top), parent_window, &root,
+        &xx, &yy, &dummy, &dummy, &dummy, &dummy);
+    if (x) *x = xx;
+    if (y) *y = yy;
+}
+
 void wxTopLevelWindowMotif::Raise()
 {
     Widget top = (Widget) GetTopWidget();
@@ -316,6 +327,32 @@ bool wxTopLevelWindowMotif::IsMaximized() const
     return FALSE;
 }
 
+void wxTopLevelWindowMotif::SetSizeHints( int minW, int minH,
+                                          int maxW, int maxH,
+                                          int incW, int incH )
+{
+    wxTopLevelWindowBase::SetSizeHints( minW, minH, maxW, maxH, incW, incH );
+
+    int count = 0;
+    Arg args[6];
+
+    if( minW > -1 ) { XtSetArg( args[count], XmNminWidth,  minW ); ++count; }
+    if( minH > -1 ) { XtSetArg( args[count], XmNminHeight, minH ); ++count; }
+    if( maxW > -1 ) { XtSetArg( args[count], XmNmaxWidth,  maxW ); ++count; }
+    if( maxH > -1 ) { XtSetArg( args[count], XmNmaxHeight, maxH ); ++count; }
+    if( incW > -1 ) { XtSetArg( args[count], XmNwidthInc,  incW ); ++count; }
+    if( incH > -1 ) { XtSetArg( args[count], XmNheightInc, incH ); ++count; }
+
+    XtSetValues( (Widget)GetShellWidget(), args, count ); 
+}
+
+bool wxTopLevelWindowMotif::SetShape( const wxRegion& region )
+{
+    return wxDoSetShape( (Display*)GetXDisplay(),
+                         XtWindow( (Widget)GetShellWidget() ),
+                         region );
+}
+
 // ---------------------------------------------------------------------------
 // Callback definition
 // ---------------------------------------------------------------------------