]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/toplevel.cpp
added HAVE_FSYNC and wxHAVE_PTHREAD_CLEANUP (replacing HAVE_THREAD_CLEANUP_FUNCTIONS)
[wxWidgets.git] / src / os2 / toplevel.cpp
index 4b3857b38655450f02f5b31e55e5252780a4c6f5..273cbab7f78164c86f190438a97d363e55e393ae 100644 (file)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Name:        msw/toplevel.cpp
-// Purpose:     implements wxTopLevelWindow for MSW
+// Name:        os2/toplevel.cpp
+// Purpose:     implements wxTopLevelWindow for OS/2
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     30.12.01
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/toplevel.h"
+    #include "wx/dialog.h"
     #include "wx/string.h"
     #include "wx/log.h"
     #include "wx/intl.h"
     #include "wx/frame.h"
     #include "wx/control.h"
     #include "wx/containr.h"        // wxSetFocusToChild()
-    #include "wx/module.h"        // wxSetFocusToChild()
 #endif //WX_PRECOMP
 
+#include "wx/module.h"        // wxSetFocusToChild()
 #include "wx/os2/private.h"
 
 // ----------------------------------------------------------------------------
 // globals
 // ----------------------------------------------------------------------------
 
-// list of all frames and modeless dialogs
-wxWindowList wxModelessWindows;
-
-// the name of the default wxWindows class
+// the name of the default wxWidgets class
 extern void          wxAssociateWinWithHandle( HWND         hWnd
                                               ,wxWindowOS2* pWin
                                              );
@@ -76,8 +74,8 @@ END_EVENT_TABLE()
 // Dialog window proc
 MRESULT EXPENTRY wxDlgProc( HWND WXUNUSED(hWnd)
                            ,UINT uMessage
-                           ,MPARAM WXUNUSED(wParam)
-                           ,MPARAM WXUNUSED(lParam)
+                           ,void * WXUNUSED(wParam)
+                           ,void * WXUNUSED(lParam)
                           )
 {
     switch(uMessage)
@@ -167,7 +165,7 @@ void wxTopLevelWindowOS2::OnActivate(
         //
         // Restore focus to the child which was last focused
         //
-        wxLogTrace(_T("focus"), _T("wxTLW %08x activated."), m_hWnd);
+        wxLogTrace(_T("focus"), _T("wxTLW %08lx activated."), m_hWnd);
 
         wxWindow*                   pParent = m_pWinLastFocused ? m_pWinLastFocused->GetParent()
                                                                 : NULL;
@@ -206,7 +204,7 @@ void wxTopLevelWindowOS2::OnActivate(
         }
 
         wxLogTrace(_T("focus"),
-                   _T("wxTLW %08x deactivated, last focused: %08x."),
+                   _T("wxTLW %08lx deactivated, last focused: %08lx."),
                    m_hWnd,
                    m_pWinLastFocused ? GetHwndOf(m_pWinLastFocused)
                                      : NULL);
@@ -223,48 +221,47 @@ WXDWORD wxTopLevelWindowOS2::OS2GetStyle(
                                                                      ,pdwExflags
                                                                     );
 
-    if (lStyle == wxDEFAULT_FRAME_STYLE)
+    if ((lStyle & wxDEFAULT_FRAME_STYLE) == wxDEFAULT_FRAME_STYLE)
         lMsflags |= FCF_SIZEBORDER | FCF_TITLEBAR | FCF_SYSMENU |
                     FCF_MINMAX | FCF_TASKLIST;
+
+    if ((lStyle & wxCAPTION) == wxCAPTION)
+        lMsflags |= FCF_TASKLIST;
     else
+        lMsflags |= FCF_NOMOVEWITHOWNER;
+
+    if ((lStyle & wxVSCROLL) == wxVSCROLL)
+        lMsflags |= FCF_VERTSCROLL;
+    if ((lStyle & wxHSCROLL) == wxHSCROLL)
+        lMsflags |= FCF_HORZSCROLL;
+    if (lStyle & wxMINIMIZE_BOX)
+        lMsflags |= FCF_MINBUTTON;
+    if (lStyle & wxMAXIMIZE_BOX)
+        lMsflags |= FCF_MAXBUTTON;
+    if (lStyle & wxTHICK_FRAME)
+        lMsflags |= FCF_DLGBORDER;
+    if (lStyle & wxSYSTEM_MENU)
+        lMsflags |= FCF_SYSMENU;
+    if (lStyle & wxCAPTION)
+        lMsflags |= FCF_TASKLIST;
+    if (lStyle & wxCLIP_CHILDREN)
     {
-        if ((lStyle & wxCAPTION) == wxCAPTION)
-            lMsflags |= FCF_TASKLIST;
-        else
-            lMsflags |= FCF_NOMOVEWITHOWNER;
-
-        if ((lStyle & wxVSCROLL) == wxVSCROLL)
-            lMsflags |= FCF_VERTSCROLL;
-        if ((lStyle & wxHSCROLL) == wxHSCROLL)
-            lMsflags |= FCF_HORZSCROLL;
-        if (lStyle & wxMINIMIZE_BOX)
-            lMsflags |= FCF_MINBUTTON;
-        if (lStyle & wxMAXIMIZE_BOX)
-            lMsflags |= FCF_MAXBUTTON;
-        if (lStyle & wxTHICK_FRAME)
-            lMsflags |= FCF_DLGBORDER;
-        if (lStyle & wxSYSTEM_MENU)
-            lMsflags |= FCF_SYSMENU;
-        if (lStyle & wxCAPTION)
-            lMsflags |= FCF_TASKLIST;
-        if (lStyle & wxCLIP_CHILDREN)
-        {
-            // Invalid for frame windows under PM
-        }
+        // Invalid for frame windows under PM
+    }
 
-        if (lStyle & wxTINY_CAPTION_VERT)
-            lMsflags |= FCF_TASKLIST;
-        if (lStyle & wxTINY_CAPTION_HORIZ)
-            lMsflags |= FCF_TASKLIST;
+    if (lStyle & wxTINY_CAPTION_VERT)
+        lMsflags |= FCF_TASKLIST;
+    if (lStyle & wxTINY_CAPTION_HORIZ)
+        lMsflags |= FCF_TASKLIST;
 
-        if ((lStyle & wxTHICK_FRAME) == 0)
-            lMsflags |= FCF_BORDER;
-        if (lStyle & wxFRAME_TOOL_WINDOW)
-            *pdwExflags = kFrameToolWindow;
+    if ((lStyle & wxTHICK_FRAME) == 0)
+        lMsflags |= FCF_BORDER;
+    if (lStyle & wxFRAME_TOOL_WINDOW)
+        *pdwExflags = kFrameToolWindow;
+
+    if (lStyle & wxSTAY_ON_TOP)
+        lMsflags |= FCF_SYSMODAL;
 
-        if (lStyle & wxSTAY_ON_TOP)
-            lMsflags |= FCF_SYSMODAL;
-    }
     return lMsflags;
 } // end of wxTopLevelWindowOS2::OS2GetCreateWindowFlags
 
@@ -310,12 +307,11 @@ WXHWND wxTopLevelWindowOS2::OS2GetParent() const
     return (WXHWND)hWndParent;
 } // end of wxTopLevelWindowOS2::OS2GetParent
 
-bool wxTopLevelWindowOS2::CreateDialog(
-  ULONG                             ulDlgTemplate
-, const wxString&                   rsTitle
-, const wxPoint&                    rPos
-, const wxSize&                     rSize
-)
+
+bool wxTopLevelWindowOS2::CreateDialog( ULONG           ulDlgTemplate,
+                                        const wxString& WXUNUSED(rsTitle),
+                                        const wxPoint&  rPos,
+                                        const wxSize&   rSize )
 {
     wxWindow*                       pParent = GetParent();
 
@@ -366,7 +362,7 @@ bool wxTopLevelWindowOS2::CreateDialog(
     {
         wxFAIL_MSG(wxT("Did you forget to include wx/os2/wx.rc in your resources?"));
 
-        wxLogSysError(wxT("Can't create dialog using template '%ul'"), ulDlgTemplate);
+        wxLogSysError(wxT("Can't create dialog using template '%ld'"), ulDlgTemplate);
 
         return FALSE;
     }
@@ -416,7 +412,7 @@ bool wxTopLevelWindowOS2::CreateDialog(
         nX = (vSizeDpy.x - nWidth) / 2;
         nY = (vSizeDpy.y - nHeight) / 2;
     }
-    m_backgroundColour.Set(wxString("LIGHT GREY"));
+    m_backgroundColour.Set(wxString(wxT("LIGHT GREY")));
 
     LONG                            lColor = (LONG)m_backgroundColour.GetPixel();
 
@@ -501,7 +497,7 @@ bool wxTopLevelWindowOS2::CreateFrame(
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error creating frame. Error: %s\n", sError);
+        wxLogError(_T("Error creating frame. Error: %s\n"), sError.c_str());
         return FALSE;
     }
 
@@ -513,7 +509,7 @@ bool wxTopLevelWindowOS2::CreateFrame(
     wxAssociateWinWithHandle(m_hWnd, this);
     wxAssociateWinWithHandle(m_hFrame, this);
 
-    m_backgroundColour.Set(wxString("MEDIUM GREY"));
+    m_backgroundColour.Set(wxString(wxT("MEDIUM GREY")));
 
     LONG                            lColor = (LONG)m_backgroundColour.GetPixel();
 
@@ -525,7 +521,7 @@ bool wxTopLevelWindowOS2::CreateFrame(
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error creating frame. Error: %s\n", sError);
+        wxLogError(_T("Error creating frame. Error: %s\n"), sError.c_str());
         return FALSE;
     }
 
@@ -562,7 +558,7 @@ bool wxTopLevelWindowOS2::CreateFrame(
     {
         vError = ::WinGetLastError(vHabmain);
         sError = wxPMErrorToStr(vError);
-        wxLogError("Error sizing frame. Error: %s\n", sError);
+        wxLogError(_T("Error sizing frame. Error: %s\n"), sError.c_str());
         return FALSE;
     }
     lStyle =  ::WinQueryWindowULong( m_hWnd
@@ -581,7 +577,7 @@ bool wxTopLevelWindowOS2::Create(
 , wxWindowID                        vId
 , const wxString&                   rsTitle
 , const wxPoint&                    rPos
-, const wxSize&                     rSize
+, const wxSize&                     rSizeOrig
 , long                              lStyle
 , const wxString&                   rsName
 )
@@ -593,6 +589,19 @@ bool wxTopLevelWindowOS2::Create(
     m_windowStyle = lStyle;
     SetName(rsName);
     m_windowId = vId == -1 ? NewControlId() : vId;
+
+    // always create a frame of some reasonable, even if arbitrary, size (at
+    // least for MSW compatibility)
+    wxSize rSize = rSizeOrig;
+    if ( rSize.x == -1 || rSize.y == -1 )
+    {
+        wxSize sizeDpy = wxGetDisplaySize();
+        if ( rSize.x == -1 )
+            rSize.x = sizeDpy.x / 3;
+        if ( rSize.y == -1 )
+            rSize.y = sizeDpy.y / 5;
+    }
+
     wxTopLevelWindows.Append(this);
     if (pParent)
         pParent->AddChild(this);
@@ -630,9 +639,6 @@ bool wxTopLevelWindowOS2::Create(
 
 wxTopLevelWindowOS2::~wxTopLevelWindowOS2()
 {
-    if (wxModelessWindows.Find(this))
-        wxModelessWindows.DeleteObject(this);
-
     //
     // After destroying an owned window, Windows activates the next top level
     // window in Z order but it may be different from our owner (to reproduce
@@ -717,7 +723,6 @@ bool wxTopLevelWindowOS2::Show(
 {
     int                             nShowCmd;
     SWP                             vSwp;
-    RECTL                           vRect;
 
     if (bShow != IsShown() )
     {
@@ -750,7 +755,7 @@ bool wxTopLevelWindowOS2::Show(
         wxActivateEvent             vEvent(wxEVT_ACTIVATE, TRUE, m_windowId);
 
         ::WinQueryWindowPos(m_hFrame, &vSwp);
-        m_bIconized = vSwp.fl & SWP_MINIMIZE;
+        m_bIconized = ( vSwp.fl & SWP_MINIMIZE ) == SWP_MINIMIZE ;
         ::WinQueryWindowPos(m_hWnd, &m_vSwpClient);
         ::WinSendMsg(m_hFrame, WM_UPDATEFRAME, (MPARAM)~0, 0);
         ::WinQueryWindowPos(m_hWnd, &vSwp);
@@ -773,7 +778,7 @@ bool wxTopLevelWindowOS2::Show(
             HWND                    hWndParent = GetHwndOf(GetParent());
 
             ::WinQueryWindowPos(hWndParent, &vSwp);
-            m_bIconized = vSwp.fl & SWP_MINIMIZE;
+            m_bIconized = (vSwp.fl & SWP_MINIMIZE)==SWP_MINIMIZE;
             ::WinEnableWindow(hWndParent, TRUE);
         }
     }
@@ -801,16 +806,14 @@ void wxTopLevelWindowOS2::Maximize(
         // We can't maximize the hidden frame because it shows it as well, so
         // just remember that we should do it later in this case
         //
-        m_bMaximizeOnShow = TRUE;
+        m_bMaximizeOnShow = bMaximize;
     }
 } // end of wxTopLevelWindowOS2::Maximize
 
 bool wxTopLevelWindowOS2::IsMaximized() const
 {
-    bool                            bIconic;
-
     ::WinQueryWindowPos(m_hFrame, (PSWP)&m_vSwp);
-    return (m_vSwp.fl & SWP_MAXIMIZE);
+    return (m_vSwp.fl & SWP_MAXIMIZE) == SWP_MAXIMIZE;
 } // end of wxTopLevelWindowOS2::IsMaximized
 
 void wxTopLevelWindowOS2::Iconize(
@@ -855,17 +858,15 @@ void wxTopLevelWindowOS2::SendSizeEvent()
 // wxTopLevelWindowOS2 fullscreen
 // ----------------------------------------------------------------------------
 
-bool wxTopLevelWindowOS2::ShowFullScreen(
-  bool                              bShow
-, long                              lStyle
-)
+bool wxTopLevelWindowOS2::ShowFullScreen( bool bShow,
+                                          long lStyle )
 {
     if (bShow)
     {
         if (IsFullScreen())
-            return FALSE;
+            return false;
 
-        m_bFsIsShowing = TRUE;
+        m_bFsIsShowing = true;
         m_lFsStyle = lStyle;
 
         //
@@ -888,8 +889,8 @@ bool wxTopLevelWindowOS2::ShowFullScreen(
         //
         // Decide which window lStyle flags to turn off
         //
-        LONG                        lNewStyle = m_lFsOldWindowStyle;
-        LONG                        lOffFlags = 0;
+        LONG lNewStyle = m_lFsOldWindowStyle;
+        LONG lOffFlags = 0;
 
         if (lStyle & wxFULLSCREEN_NOBORDER)
             lOffFlags |= FCF_BORDER;
@@ -909,16 +910,14 @@ bool wxTopLevelWindowOS2::ShowFullScreen(
         //
         // Resize to the size of the desktop
         //
-        int                         nWidth;
-        int                         nHeight;
-        RECTL                       vRect = wxGetWindowRect(HWND_DESKTOP);
+        int   nWidth;
+        int   nHeight;
+        RECTL vRect = wxGetWindowRect(HWND_DESKTOP);
 
         nWidth = vRect.xRight - vRect.xLeft;
         nHeight = vRect.yTop - vRect.yBottom;
 
-        SetSize( nWidth
-                ,nHeight
-               );
+        SetSize( nWidth, nHeight );
 
         //
         // Now flush the window style cache and actually go full-screen
@@ -932,21 +931,17 @@ bool wxTopLevelWindowOS2::ShowFullScreen(
                           ,SWP_SIZE | SWP_MOVE
                          );
 
-        wxSizeEvent                 vEvent( wxSize( nWidth
-                                                   ,nHeight
-                                                  )
-                                           ,GetId()
-                                          );
-
+        wxSize full( nWidth, nHeight );
+        wxSizeEvent vEvent( full, GetId() );
         GetEventHandler()->ProcessEvent(vEvent);
-        return TRUE;
+        return true;
     }
     else
     {
         if (!IsFullScreen())
-            return FALSE;
+            return false;
 
-        m_bFsIsShowing = FALSE;
+        m_bFsIsShowing = false;
         Maximize(m_bFsIsMaximized);
         ::WinSetWindowULong( (HWND)GetHWND()
                             ,QWL_STYLE
@@ -960,7 +955,7 @@ bool wxTopLevelWindowOS2::ShowFullScreen(
                           ,m_vFsOldSize.height
                           ,SWP_SIZE | SWP_MOVE
                          );
-        return TRUE;
+        return true;
     }
 } // end of wxTopLevelWindowOS2::ShowFullScreen
 
@@ -1082,7 +1077,7 @@ HWND wxTLWHiddenParentModule::GetHWND()
             static const wxChar*    zHIDDEN_PARENT_CLASS = _T("wxTLWHiddenParent");
 
             if (!::WinRegisterClass( wxGetInstance()
-                                    ,zHIDDEN_PARENT_CLASS
+                                    ,(PSZ)zHIDDEN_PARENT_CLASS
                                     ,NULL
                                     ,0
                                     ,sizeof(ULONG)
@@ -1096,7 +1091,7 @@ HWND wxTLWHiddenParentModule::GetHWND()
             }
         }
         m_shWnd = ::WinCreateWindow( HWND_DESKTOP
-                                    ,m_szClassName
+                                    ,(PSZ)m_szClassName
                                     ,""
                                     ,0L
                                     ,(LONG)0L