]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/window.cpp
Use wxClientDC in header window so we don't clip (because of gtk_paint_box not
[wxWidgets.git] / src / os2 / window.cpp
index 7a31cfbbda2395e5d5fb447e0979700241c59efd..eda3bf97476370985f892a1c755ab4aeb0cce6fe 100644 (file)
     #include <stdio.h>
 #endif
 
-#define DEBUG_PRINTF(NAME)   { static int raz=0; \
-  printf( #NAME " %i\n",raz); fflush(stdout);       \
-   raz++;                                        \
- }
-
 #if     wxUSE_OWNER_DRAWN
     #include "wx/ownerdrw.h"
 #endif
@@ -158,6 +153,7 @@ BEGIN_EVENT_TABLE(wxWindow, wxWindowBase)
     EVT_SYS_COLOUR_CHANGED(wxWindow::OnSysColourChanged)
     EVT_INIT_DIALOG(wxWindow::OnInitDialog)
     EVT_IDLE(wxWindow::OnIdle)
+    EVT_SET_FOCUS(wxWindow::OnSetFocus)
 END_EVENT_TABLE()
 
 // ===========================================================================
@@ -249,9 +245,6 @@ bool wxWindow::OS2Command(
 , WXWORD                            WXUNUSED(uId)
 )
 {
-
-DEBUG_PRINTF(wxWindow::OS2Command);
-
     return(FALSE);
 }
 
@@ -301,9 +294,6 @@ void wxWindow::Init()
     m_lLastMouseY = -1;
     m_nLastMouseEvent = -1;
 #endif // wxUSE_MOUSEEVENT_HACK
-
-DEBUG_PRINTF(wxWindow::Init-End);
-
 } // wxWindow::Init
 
 //
@@ -311,7 +301,6 @@ DEBUG_PRINTF(wxWindow::Init-End);
 //
 wxWindow::~wxWindow()
 {
-DEBUG_PRINTF(wxWindow::~wxWindow-Start);
     m_isBeingDeleted = TRUE;
 
     OS2DetachWindowMenu();
@@ -321,8 +310,6 @@ DEBUG_PRINTF(wxWindow::~wxWindow-Start);
 
     if (m_hWnd)
     {
-//      UnsubclassWin();
-
         if(!::WinDestroyWindow(GetHWND()))
             wxLogLastError(wxT("DestroyWindow"));
         //
@@ -330,7 +317,6 @@ DEBUG_PRINTF(wxWindow::~wxWindow-Start);
         //
         wxRemoveHandleAssociation(this);
     }
-DEBUG_PRINTF(wxWindow::~wxWindow-End);
 } // end of wxWindow::~wxWindow
 
 bool wxWindow::Create(
@@ -372,6 +358,12 @@ bool wxWindow::Create(
     // set in those class create procs.  PM's basic windows styles are
     // very limited.
     //
+    ulCreateFlags |=  WS_VISIBLE;
+
+
+    if ( lStyle & wxCLIP_SIBLINGS )
+        ulCreateFlags |= WS_CLIPSIBLINGS;
+
     if (lStyle & wxCLIP_CHILDREN )
         ulCreateFlags |= WS_CLIPCHILDREN;
 
@@ -513,7 +505,6 @@ bool wxWindow::SetFont(
   const wxFont&                     rFont
 )
 {
-DEBUG_PRINTF(wxWindow::SetFont);
     if (!wxWindowBase::SetFont(rFont))
     {
         // nothing to do
@@ -729,19 +720,12 @@ void wxWindow::SubclassWin(
     HWND                            hwnd = (HWND)hWnd;
 
     wxASSERT_MSG( !m_fnOldWndProc, wxT("subclassing window twice?") );
-
     wxCHECK_RET(::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in SubclassWin") );
-
-//  wxAssociateWinWithHandle(hwnd, this);
-
     m_fnOldWndProc = (WXFARPROC) ::WinSubclassWindow(hwnd, (PFNWP)wxWndProc);
-//    ::WinSetWindowULong(hwnd, QWL_USER, (ULONG)wxWndProc);
 } // end of wxWindow::SubclassWin
 
 void wxWindow::UnsubclassWin()
 {
-//    wxRemoveHandleAssociation(this);
-
     //
     // Restore old Window proc
     //
@@ -749,11 +733,10 @@ void wxWindow::UnsubclassWin()
 
     if (m_hWnd)
     {
-//        m_hWnd = 0;
-
         wxCHECK_RET( ::WinIsWindow(vHabmain, hwnd), wxT("invalid HWND in UnsubclassWin") );
 
         PFNWP                       fnProc = (PFNWP)::WinQueryWindowPtr(hwnd, QWP_PFNWP);
+
         if ( (m_fnOldWndProc != 0) && (fnProc != (PFNWP) m_fnOldWndProc))
         {
             WinSubclassWindow(hwnd, (PFNWP)m_fnOldWndProc);
@@ -1114,7 +1097,10 @@ void wxWindow::DoGetClientSize(
     RECTL                           vRect;
 
     hWndClient = ::WinWindowFromID(GetHwnd(), FID_CLIENT);
-    ::WinQueryWindowRect(hWndClient, &vRect);
+    if( hWndClient == NULLHANDLE)
+       ::WinQueryWindowRect(GetHwnd(), &vRect);
+    else
+       ::WinQueryWindowRect(hWndClient, &vRect);
 
     if (pWidth)
         *pWidth  = vRect.xRight;
@@ -1338,10 +1324,12 @@ int wxWindow::GetCharHeight() const
     hPs = ::WinGetPS(GetHwnd());
 
     if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
+    {
+        ::WinReleasePS(hPs);
         return (0);
-    else
-        return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender);
+    }
     ::WinReleasePS(hPs);
+    return(vFontMetrics.lMaxAscender + vFontMetrics.lMaxDescender);
 } // end of wxWindow::GetCharHeight
 
 int wxWindow::GetCharWidth() const
@@ -1352,10 +1340,12 @@ int wxWindow::GetCharWidth() const
     hPs = ::WinGetPS(GetHwnd());
 
     if(!GpiQueryFontMetrics(hPs, sizeof(FONTMETRICS), &vFontMetrics))
+    {
+        ::WinReleasePS(hPs);
         return (0);
-    else
-        return(vFontMetrics.lAveCharWidth);
+    }
     ::WinReleasePS(hPs);
+    return(vFontMetrics.lAveCharWidth);
 } // end of wxWindow::GetCharWidth
 
 void wxWindow::GetTextExtent(
@@ -1519,8 +1509,6 @@ MRESULT wxWindow::OS2DefWindowProc(
 , WXLPARAM                          lParam
 )
 {
-DEBUG_PRINTF(wxWindow::OS2DefWindowProc);
-
     if (m_fnOldWndProc)
         return (MRESULT)m_fnOldWndProc(GetHWND(), (ULONG)uMsg, (MPARAM)wParam, (MPARAM)lParam);
     else
@@ -1533,8 +1521,6 @@ bool wxWindow::OS2ProcessMessage(
 {
     QMSG*                           pQMsg = (QMSG*)pMsg;
 
-DEBUG_PRINTF(OS2ProcessMessage);
-
     if (m_hWnd != 0 && (GetWindowStyleFlag() & wxTAB_TRAVERSAL))
     {
         //
@@ -1740,11 +1726,6 @@ void wxWindow::UnpackCommand(
 , WORD*                             pCmd
 )
 {
-/*
-    *pId = LOWORD(wParam);
-    *phWnd = (WXHWND)lParam;
-    *pCmd = HIWORD(wParam);
-*/
     *pId = LOWORD(wParam);
     *phWnd = NULL;  // or may be GetHWND() ?
     *pCmd = LOWORD(lParam);
@@ -1811,7 +1792,6 @@ MRESULT EXPENTRY wxWndProc(
     // Trace all ulMsgs - useful for the debugging
     //
 #ifdef __WXDEBUG__
-DEBUG_PRINTF(__WXDEBUG__wxWndProc);
     wxLogTrace(wxTraceMessages, wxT("Processing %s(wParam=%8lx, lParam=%8lx)"),
                wxGetMessageName(ulMsg), wParam, lParam);
 #endif // __WXDEBUG__
@@ -1872,17 +1852,6 @@ MRESULT wxWindow::OS2WindowProc(
     WXHICON                         hIcon;
     WXHBRUSH                        hBrush;
 
-    //
-    // The return value
-    //
-//  union
-//  {
-//      bool                        bAllow;
-//      MRESULT                     mResult;
-//      WXHICON                     hIcon;
-//      WXHBRUSH                    hBrush;
-//  } vRc;
-
     //
     // For most messages we should return 0 when we do process the message
     //
@@ -1951,7 +1920,6 @@ MRESULT wxWindow::OS2WindowProc(
             break;
 
         case WM_PAINT:
-DEBUG_PRINTF(WM_PAINT)
             bProcessed = HandlePaint();
             break;
 
@@ -1962,11 +1930,9 @@ DEBUG_PRINTF(WM_PAINT)
             //
             bProcessed = TRUE;
             mResult = (MRESULT)TRUE;
-DEBUG_PRINTF(WM_CLOSE)
             break;
 
         case WM_SHOW:
-DEBUG_PRINTF(WM_SHOW)
             bProcessed = HandleShow(wParam != 0, (int)lParam);
             break;
 
@@ -2005,11 +1971,9 @@ DEBUG_PRINTF(WM_SHOW)
             {
                 WORD id, cmd;
                 WXHWND hwnd;
-DEBUG_PRINTF(WM_COMMAND-in)
                 UnpackCommand(wParam, lParam, &id, &hwnd, &cmd);
 
                 bProcessed = HandleCommand(id, cmd, hwnd);
-DEBUG_PRINTF(WM_COMMAND-out)
             }
             break;
 
@@ -2142,6 +2106,15 @@ DEBUG_PRINTF(WM_COMMAND-out)
             }
             break;
 #endif
+        case WM_ERASEBACKGROUND:
+            //
+            // Returning TRUE to requestw PM to paint the window background
+            // in SYSCLR_WINDOW. We don't really want that
+            //
+            bProcessed = HandleEraseBkgnd((WXHDC)(HPS)wParam);
+            mResult = (MRESULT)(FALSE);
+            break;
+
         //
         // Instead of CTLCOLOR messages PM sends QUERYWINDOWPARAMS to
         // things such as colors and fonts and such
@@ -2169,17 +2142,6 @@ DEBUG_PRINTF(WM_COMMAND-out)
             bProcessed = HandlePresParamChanged(wParam);
             break;
 
-        // move this to wxFrame
-        case WM_ERASEBACKGROUND:
-            bProcessed = HandleEraseBkgnd((WXHDC)(HDC)wParam);
-            if (bProcessed)
-            {
-                //
-                // We processed the message, i.e. erased the background
-                //
-                mResult = (MRESULT)TRUE;
-            }
-            break;
 
         // move all drag and drops to wxDrg
         case WM_ENDDRAG:
@@ -2224,14 +2186,16 @@ DEBUG_PRINTF(WM_COMMAND-out)
             }
             break;
     }
-
     if (!bProcessed)
     {
 #ifdef __WXDEBUG__
         wxLogTrace(wxTraceMessages, wxT("Forwarding %s to DefWindowProc."),
                    wxGetMessageName(uMsg));
 #endif // __WXDEBUG__
-        mResult = OS2DefWindowProc(uMsg, wParam, lParam);
+        if (IsKindOf(CLASSINFO(wxFrame)))
+            mResult = ::WinDefWindowProc(m_hWnd, uMsg, wParam, lParam);
+        else
+            mResult = OS2DefWindowProc(uMsg, wParam, lParam);
     }
     return mResult;
 } // end of wxWindow::OS2WindowProc
@@ -2375,6 +2339,8 @@ bool wxWindow::OS2Create(
     long                            lWidth1  = 20L;
     long                            lHeight1 = 20L;
     int                             nControlId = 0;
+    int                             nNeedsubclass = 0;
+    PCSZ                            pszClass = zClass;
 
     //
     // Find parent's size, if it exists, to set up a possible default
@@ -2414,6 +2380,21 @@ bool wxWindow::OS2Create(
     {
             nControlId = ulId;
     }
+    else
+    {
+        // no standard controls
+        if(wxString (wxT("wxFrameClass")) == wxString(zClass) )
+        {
+            pszClass =  WC_FRAME;
+            nNeedsubclass = 1;
+        }
+        else
+        {
+            nControlId = ulId;
+            if(nControlId < 0)
+                nControlId = FID_CLIENT;
+        }
+    }
 
     //
     // We will either have a registered class via string name or a standard PM Class via a long
@@ -2426,9 +2407,9 @@ bool wxWindow::OS2Create(
                                        ,(LONG)lY1
                                        ,(LONG)lWidth
                                        ,(LONG)lHeight
-                                       ,NULLHANDLE
+                                       ,hOwner
                                        ,HWND_TOP
-                                       ,(ULONG)ulId
+                                       ,(ULONG)nControlId
                                        ,pCtlData
                                        ,pPresParams
                                       );
@@ -2462,9 +2443,14 @@ bool wxWindow::OS2Create(
     //
     // Now need to subclass window.
     //
-
-    SubclassWin(GetHWND());
-
+    if(!nNeedsubclass)
+    {
+         wxAssociateWinWithHandle((HWND)m_hWnd,this);
+    }
+    else
+    {
+        SubclassWin(GetHWND());
+    }
     return TRUE;
 } // end of wxWindow::OS2Create
 
@@ -2856,47 +2842,65 @@ bool wxWindow::HandlePaint()
          wxLogLastError("CreateRectRgn");
          return FALSE;
     }
-    //
-    // Debug code
-    //
-#ifdef __WXDEBUG__
-    {
-        HWND                        hWnd;
-        HWND                        hWnd0 = NULLHANDLE;
-
-        hWnd = GetHwnd();
-        if(hWnd != hWnd0)
-            printf("HandlePaint hWnd=%x  ",hWnd);
-    }
-#endif
 
     m_updateRegion = wxRegion(hRgn);
     vEvent.SetEventObject(this);
+    if (!GetEventHandler()->ProcessEvent(vEvent))
+    {
+        HPS                         hPS;
+
+        hPS = ::WinBeginPaint( GetHwnd()
+                              ,NULLHANDLE
+                              ,&vRect
+                             );
+        if(hPS)
+        {
+            ::GpiCreateLogColorTable( hPS
+                                     ,0L
+                                     ,LCOLF_CONSECRGB
+                                     ,0L
+                                     ,(LONG)wxTheColourDatabase->m_nSize
+                                     ,(PLONG)wxTheColourDatabase->m_palTable
+                                    );
+            ::GpiCreateLogColorTable( hPS
+                                     ,0L
+                                     ,LCOLF_RGB
+                                     ,0L
+                                     ,0L
+                                     ,NULL
+                                    );
+
+            ::WinFillRect(hPS, &vRect,  GetBackgroundColour().GetPixel());
+            ::WinEndPaint(hPS);
+        }
+    }
     return (GetEventHandler()->ProcessEvent(vEvent));
 } // end of wxWindow::HandlePaint
 
-bool wxWindow::HandleEraseBkgnd(WXHDC hdc)
+bool wxWindow::HandleEraseBkgnd(
+  WXHDC                             hDC
+)
 {
-    // TODO:  will have to worry about this later as part of
-    //        the handling of changed presentation parameters
-    /*
-    if ( ::IsIconic(GetHwnd()) )
+    SWP                             vSwp;
+
+    ::WinQueryWindowPos(GetHwnd(), &vSwp);
+    if (vSwp.fl & SWP_MINIMIZE)
         return TRUE;
 
-    wxDC dc;
+    wxDC                            vDC;
+
+    vDC.m_hPS = (HPS)hDC; // this is really a PS
+    vDC.SetWindow(this);
+    vDC.BeginDrawing();
 
-    dc.SetHDC(hdc);
-    dc.SetWindow(this);
-    dc.BeginDrawing();
+    wxEraseEvent                    vEvent(m_windowId, &vDC);
 
-    wxEraseEvent event(m_windowId, &dc);
-    event.SetEventObject(this);
-    bool rc = GetEventHandler()->ProcessEvent(event);
+    vEvent.SetEventObject(this);
+
+    bool                            rc = GetEventHandler()->ProcessEvent(vEvent);
 
-    dc.EndDrawing();
-    dc.SelectOldObjects(hdc);
-    dc.SetHDC((WXHDC) NULL);
-    */
+    vDC.EndDrawing();
+    vDC.m_hPS = NULLHANDLE;
     return TRUE;
 } // end of wxWindow::HandleEraseBkgnd
 
@@ -2904,7 +2908,11 @@ void wxWindow::OnEraseBackground(
   wxEraseEvent&                     rEvent
 )
 {
-    // TODO:
+    RECTL                           vRect;
+    HPS                             hPS = rEvent.m_dc->m_hPS;
+
+    ::WinQueryWindowRect(GetHwnd(), &vRect);
+    ::WinFillRect(hPS, &vRect,  m_backgroundColour.GetPixel());
 }  // end of wxWindow::OnEraseBackground
 
 // ---------------------------------------------------------------------------