Ignore:
Timestamp:
Dec 26, 1999, 6:30:20 PM (26 years ago)
Author:
cbratschi
Message:

non-client fixes, DefWndProc enhancements, several other bugs fixed

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/win32wbase.cpp

    r2202 r2204  
    1 /* $Id: win32wbase.cpp,v 1.118 1999-12-24 21:44:04 sandervl Exp $ */
     1/* $Id: win32wbase.cpp,v 1.119 1999-12-26 17:30:18 cbratschi Exp $ */
    22/*
    33 * Win32 Window Base Class for OS/2
     
    88 * Parts based on Wine Windows code (windows\win.c)
    99 *
    10  * Copyright 1993, 1994 Alexandre Julliard
     10 * Copyright 1993, 1994, 1996 Alexandre Julliard
     11 *           1995 Alex Korobka
    1112 *
    1213 * TODO: Not thread/process safe
     
    146147  fInternalMsg     = FALSE;
    147148  fNoSizeMsg       = FALSE;
    148   fMovingChildren  = FALSE;
    149149  fIsDestroyed     = FALSE;
    150150  fDestroyWindowCalled = FALSE;
     
    190190  flags            = 0;
    191191  isIcon           = FALSE;
    192   lastHitTestVal   = 0;
     192  lastHitTestVal   = HTOS_NORMAL;
     193  fIgnoreHitTest   = FALSE;
    193194  owner            = NULL;
    194195  windowClass      = 0;
     
    777778ULONG Win32BaseWindow::MsgClose()
    778779{
    779   if(SendInternalMessageA(WM_CLOSE, 0, 0) == 0) {
    780         dprintf(("Win32BaseWindow::MsgClose, app handles msg"));
    781         return 0; //app handles this message
    782   }
    783   return 1;
     780  return SendInternalMessageA(WM_CLOSE,0,0);
    784781}
    785782//******************************************************************************
     
    856853ULONG Win32BaseWindow::MsgPosChanging(LPARAM lp)
    857854{
    858     if(fNoSizeMsg || (getParent() && getParent()->InMovingChildren()))
     855    if(fNoSizeMsg)
    859856        return 1;
    860857
     
    865862ULONG Win32BaseWindow::MsgPosChanged(LPARAM lp)
    866863{
    867     if(fNoSizeMsg || (getParent() && getParent()->InMovingChildren()))
     864    if(fNoSizeMsg)
    868865        return 1;
    869866
     
    892889  lastHitTestVal = SendInternalMessageA(WM_NCHITTEST, 0, MAKELONG((USHORT)msg->pt.x, (USHORT)msg->pt.y));
    893890  dprintf2(("MsgHitTest returned %x", lastHitTestVal));
    894   return 1; //TODO: May need to change this
     891
     892  if (lastHitTestVal == HTERROR)
     893    return HTOS_ERROR;
     894
     895#if 0 //CB: problems with groupboxes, internal handling is better
     896  if (lastHitTestVal == HTTRANSPARENT)
     897    return HTOS_TRANSPARENT;
     898#endif
     899
     900  return HTOS_NORMAL;
    895901}
    896902//******************************************************************************
     
    967973
    968974    dprintf(("MsgButton at (%d,%d)", msg->pt.x, msg->pt.y));
    969     switch(msg->message) { //TODO: double click also?
     975    switch(msg->message) {
    970976        case WM_LBUTTONDBLCLK:
    971977        case WM_RBUTTONDBLCLK:
    972978        case WM_MBUTTONDBLCLK:
     979        case WM_NCLBUTTONDBLCLK:
     980        case WM_NCRBUTTONDBLCLK:
     981        case WM_NCMBUTTONDBLCLK:
    973982                if (!(windowClass && windowClass->getClassLongA(GCL_STYLE) & CS_DBLCLKS))
    974983                {
    975984                    msg->message = msg->message - (WM_LBUTTONDBLCLK - WM_LBUTTONDOWN); //dblclick -> down
    976985                    MsgButton(msg);
     986                    msg->message++; //button-up
    977987                    return MsgButton(msg);
    978988                }
     
    981991        case WM_RBUTTONDOWN:
    982992        case WM_MBUTTONDOWN:
     993        case WM_NCLBUTTONDOWN:
     994        case WM_NCRBUTTONDOWN:
     995        case WM_NCMBUTTONDOWN:
    983996                fClick = TRUE;
    984997                break;
     
    12361249}
    12371250/***********************************************************************
     1251 *           NC_HandleNCLButtonDown
     1252 *
     1253 * Handle a WM_NCLBUTTONDOWN message. Called from DefWindowProc().
     1254 */
     1255LONG Win32BaseWindow::HandleNCLButtonDown(WPARAM wParam,LPARAM lParam)
     1256{
     1257  switch(wParam)  /* Hit test */
     1258  {
     1259    case HTCAPTION:
     1260      SendInternalMessageA(WM_SYSCOMMAND,SC_MOVE+HTCAPTION,lParam);
     1261      break;
     1262
     1263    case HTSYSMENU:
     1264      SendInternalMessageA(WM_SYSCOMMAND,SC_MOUSEMENU+HTSYSMENU,lParam);
     1265      break;
     1266
     1267    case HTMENU:
     1268      SendInternalMessageA(WM_SYSCOMMAND,SC_MOUSEMENU,lParam);
     1269      break;
     1270
     1271    case HTHSCROLL:
     1272      SendInternalMessageA(WM_SYSCOMMAND,SC_HSCROLL+HTHSCROLL,lParam);
     1273      break;
     1274
     1275    case HTVSCROLL:
     1276      SendInternalMessageA(WM_SYSCOMMAND,SC_VSCROLL+HTVSCROLL,lParam);
     1277      break;
     1278
     1279    case HTLEFT:
     1280    case HTRIGHT:
     1281    case HTTOP:
     1282    case HTTOPLEFT:
     1283    case HTTOPRIGHT:
     1284    case HTBOTTOM:
     1285    case HTBOTTOMLEFT:
     1286    case HTBOTTOMRIGHT:
     1287        /* make sure hittest fits into 0xf and doesn't overlap with HTSYSMENU */
     1288        SendInternalMessageA(WM_SYSCOMMAND,SC_SIZE+wParam-2,lParam);
     1289        break;
     1290    case HTBORDER:
     1291        break;
     1292  }
     1293
     1294  return 0;
     1295}
     1296//******************************************************************************
     1297//******************************************************************************
     1298LONG Win32BaseWindow::HandleNCLButtonUp(WPARAM wParam,LPARAM lParam)
     1299{
     1300  switch(wParam)  /* Hit test */
     1301  {
     1302    case HTMINBUTTON:
     1303      SendInternalMessageA(WM_SYSCOMMAND,SC_MINIMIZE,lParam);
     1304      break;
     1305
     1306    case HTMAXBUTTON:
     1307      SendInternalMessageA(WM_SYSCOMMAND,SC_MAXIMIZE,lParam);
     1308      break;
     1309
     1310    case HTCLOSE:
     1311      SendInternalMessageA(WM_SYSCOMMAND,SC_CLOSE,lParam);
     1312      break;
     1313  }
     1314
     1315  return 0;
     1316}
     1317/***********************************************************************
     1318 *           NC_HandleNCLButtonDblClk
     1319 *
     1320 * Handle a WM_NCLBUTTONDBLCLK message. Called from DefWindowProc().
     1321 */
     1322LONG Win32BaseWindow::HandleNCLButtonDblClk(WPARAM wParam,LPARAM lParam)
     1323{
     1324  /*
     1325   * if this is an icon, send a restore since we are handling
     1326   * a double click
     1327   */
     1328  if (dwStyle & WS_MINIMIZE)
     1329  {
     1330    SendInternalMessageA(WM_SYSCOMMAND,SC_RESTORE,lParam);
     1331    return 0;
     1332  }
     1333
     1334  switch(wParam)  /* Hit test */
     1335  {
     1336    case HTCAPTION:
     1337      /* stop processing if WS_MAXIMIZEBOX is missing */
     1338      if (dwStyle & WS_MAXIMIZEBOX)
     1339        SendInternalMessageA(WM_SYSCOMMAND,
     1340                      (dwStyle & WS_MAXIMIZE) ? SC_RESTORE : SC_MAXIMIZE,
     1341                      lParam);
     1342      break;
     1343
     1344    case HTSYSMENU:
     1345      if (!(GetClassWord(Win32Hwnd,GCW_STYLE) & CS_NOCLOSE))
     1346        SendInternalMessageA(WM_SYSCOMMAND,SC_CLOSE,lParam);
     1347      break;
     1348
     1349    case HTHSCROLL:
     1350      SendInternalMessageA(WM_SYSCOMMAND,SC_HSCROLL+HTHSCROLL,lParam);
     1351      break;
     1352
     1353    case HTVSCROLL:
     1354      SendInternalMessageA(WM_SYSCOMMAND,SC_VSCROLL+HTVSCROLL,lParam);
     1355      break;
     1356  }
     1357
     1358  return 0;
     1359}
     1360/***********************************************************************
    12381361 *           NC_HandleSysCommand
    12391362 *
     
    12511374    switch (uCommand)
    12521375    {
    1253 #if 0
     1376
    12541377    case SC_SIZE:
     1378    {
     1379      DWORD flags = 0;
     1380
     1381      switch ((wParam & 0xF)+2)
     1382      {
     1383        case HTLEFT:
     1384          flags = TFOS_LEFT;
     1385          break;
     1386
     1387        case HTRIGHT:
     1388          flags = TFOS_RIGHT;
     1389          break;
     1390
     1391        case HTTOP:
     1392          flags = TFOS_TOP;
     1393          break;
     1394
     1395        case HTTOPLEFT:
     1396          flags = TFOS_TOP | TFOS_LEFT;
     1397          break;
     1398
     1399        case HTTOPRIGHT:
     1400          flags = TFOS_TOP | TFOS_RIGHT;
     1401          break;
     1402
     1403        case HTBOTTOM:
     1404          flags = TFOS_BOTTOM;
     1405          break;
     1406
     1407        case HTBOTTOMLEFT:
     1408          flags = TFOS_BOTTOM | TFOS_LEFT;
     1409          break;
     1410
     1411        case HTBOTTOMRIGHT:
     1412          flags = TFOS_BOTTOM | TFOS_RIGHT;
     1413          break;
     1414      }
     1415      if (flags) FrameTrackFrame(this,flags);
     1416      break;
     1417    }
     1418
    12551419    case SC_MOVE:
    1256         NC_DoSizeMove( hwnd, wParam );
    1257         break;
    1258 #endif
     1420      FrameTrackFrame(this,TFOS_MOVE);
     1421      break;
    12591422
    12601423    case SC_MINIMIZE:
     
    13621525//******************************************************************************
    13631526//******************************************************************************
     1527LRESULT Win32BaseWindow::DefWndPrint(HDC hdc,ULONG uFlags)
     1528{
     1529  /*
     1530   * Visibility flag.
     1531   */
     1532  if ( (uFlags & PRF_CHECKVISIBLE) &&
     1533       !IsWindowVisible() )
     1534      return 0;
     1535
     1536  /*
     1537   * Unimplemented flags.
     1538   */
     1539  if ( (uFlags & PRF_CHILDREN) ||
     1540       (uFlags & PRF_OWNED)    ||
     1541       (uFlags & PRF_NONCLIENT) )
     1542  {
     1543    dprintf(("WM_PRINT message with unsupported flags\n"));
     1544  }
     1545
     1546  /*
     1547   * Background
     1548   */
     1549  if ( uFlags & PRF_ERASEBKGND)
     1550    SendInternalMessageA(WM_ERASEBKGND, (WPARAM)hdc, 0);
     1551
     1552  /*
     1553   * Client area
     1554   */
     1555  if ( uFlags & PRF_CLIENT)
     1556    SendInternalMessageA(WM_PRINTCLIENT, (WPARAM)hdc, PRF_CLIENT);
     1557
     1558
     1559  return 0;
     1560}
     1561//******************************************************************************
     1562//******************************************************************************
    13641563LRESULT Win32BaseWindow::DefWindowProcA(UINT Msg, WPARAM wParam, LPARAM lParam)
    13651564{
     
    14111610    case WM_SETREDRAW:
    14121611    {
    1413      DWORD oldStyle = getStyle();
    1414 
    1415         if(wParam)
    1416                 setStyle(getStyle() | WS_VISIBLE);
    1417         else    setStyle(getStyle() & ~WS_VISIBLE);
    1418 
    1419         updateWindowStyle(getExStyle(), oldStyle);
    1420 
    1421         return 0; //TODO
    1422     }
     1612      if (wParam)
     1613      {
     1614        setStyle(getStyle() | WS_VISIBLE);
     1615        OSLibWinEnableWindowUpdate(OS2HwndFrame,TRUE);
     1616      } else
     1617      {
     1618        if (getStyle() & WS_VISIBLE)
     1619        {
     1620          setStyle(getStyle() & ~WS_VISIBLE);
     1621          OSLibWinEnableWindowUpdate(OS2HwndFrame,FALSE);
     1622        }
     1623      }
     1624      return 0;
     1625    }
     1626
     1627    case WM_NCPAINT:
     1628        return 0;
     1629
     1630    case WM_NCACTIVATE:
     1631        return TRUE;
     1632
    14231633    case WM_NCCREATE:
    14241634        return(TRUE);
     1635
     1636    case WM_NCDESTROY:
     1637        return 0;
    14251638
    14261639    case WM_NCCALCSIZE:
     
    14581671        return (LOWORD(lParam) == HTCAPTION) ? MA_NOACTIVATE : MA_ACTIVATE;
    14591672    }
     1673
     1674    case WM_ACTIVATE:
     1675      //CB: todo
     1676      return 0;
     1677
    14601678    case WM_SETCURSOR:
    14611679    {
     
    14701688        if (wParam == Win32Hwnd)
    14711689        {
    1472           HCURSOR hCursor = windowClass ? windowClass->getCursor():LoadCursorA(0,IDC_ARROWA);
    1473 
    1474           if (hCursor) SetCursor(hCursor);
    1475           return 1;
     1690          HCURSOR hCursor;
     1691
     1692          switch(lastHitTestVal)
     1693          {
     1694            case HTLEFT:
     1695            case HTRIGHT:
     1696              hCursor = LoadCursorA(0,IDC_SIZEWEA);
     1697              break;
     1698
     1699            case HTTOP:
     1700            case HTBOTTOM:
     1701              hCursor = LoadCursorA(0,IDC_SIZENSA);
     1702              break;
     1703
     1704            case HTTOPLEFT:
     1705            case HTBOTTOMRIGHT:
     1706              hCursor = LoadCursorA(0,IDC_SIZENWSEA);
     1707              break;
     1708
     1709            case HTTOPRIGHT:
     1710            case HTBOTTOMLEFT:
     1711              hCursor = LoadCursorA(0,IDC_SIZENESWA);
     1712              break;
     1713
     1714            default:
     1715              hCursor = windowClass ? windowClass->getCursor():LoadCursorA(0,IDC_ARROWA);
     1716              break;
     1717          }
     1718
     1719          if (hCursor)
     1720          {
     1721            SetCursor(hCursor);
     1722            return 1;
     1723          } else return 0;
    14761724        } else return 0;
    14771725    }
     1726
    14781727    case WM_MOUSEMOVE:
    1479         return 0; //we do our own cursor handling
     1728        return 0;
    14801729
    14811730    case WM_WINDOWPOSCHANGED:
     
    15251774        return 1;
    15261775    }
     1776
     1777    case WM_PRINT:
     1778        return DefWndPrint(wParam,lParam);
     1779
    15271780    case WM_PAINTICON:
    15281781    case WM_PAINT:
     
    15481801
    15491802    case WM_NCLBUTTONDOWN:
     1803        return HandleNCLButtonDown(wParam,lParam);
     1804
    15501805    case WM_NCLBUTTONUP:
     1806        return HandleNCLButtonUp(wParam,lParam);
     1807
    15511808    case WM_NCLBUTTONDBLCLK:
    1552     case WM_NCRBUTTONUP:
     1809        return HandleNCLButtonDblClk(wParam,lParam);
     1810
    15531811    case WM_NCRBUTTONDOWN:
    15541812    case WM_NCRBUTTONDBLCLK:
    15551813    case WM_NCMBUTTONDOWN:
     1814    case WM_NCMBUTTONDBLCLK:
     1815        if (lastHitTestVal == HTERROR) MessageBeep(MB_ICONEXCLAMATION);
     1816        return 0;
     1817
     1818    case WM_NCRBUTTONUP:
    15561819    case WM_NCMBUTTONUP:
    1557     case WM_NCMBUTTONDBLCLK:
    1558         return 0;           //TODO: Send WM_SYSCOMMAND if required
    1559 
    1560     case WM_NCHITTEST: //TODO: Calculate position of
    1561         return HTCLIENT;
     1820        return 0;
     1821
     1822    case WM_NCHITTEST:
     1823    {
     1824      POINT point;
     1825
     1826      point.x = (SHORT)LOWORD(lParam);
     1827      point.y = (SHORT)HIWORD(lParam);
     1828
     1829      return FrameHitTest(this,point.x,point.y);
     1830    }
    15621831
    15631832    case WM_SYSCOMMAND:
     
    16121881        return 0;
    16131882
     1883    case WM_SHOWWINDOW:
     1884        if (!lParam) return 0; /* sent from ShowWindow */
     1885        if (!(dwStyle & WS_POPUP) || !owner) return 0;
     1886        if ((dwStyle & WS_VISIBLE) && wParam) return 0;
     1887        else if (!(dwStyle & WS_VISIBLE) && !wParam) return 0;
     1888        ShowWindow(wParam ? SW_SHOWNOACTIVATE : SW_HIDE);
     1889        return 0;
     1890
     1891    case WM_CANCELMODE:
     1892        //if (getParent() == windowDesktop) EndMenu();
     1893        if (GetCapture() == Win32Hwnd) ReleaseCapture();
     1894        return 0;
     1895
     1896    case WM_DROPOBJECT:
     1897        return DRAG_FILE;
     1898
     1899    case WM_QUERYDROPOBJECT:
     1900        if (dwExStyle & WS_EX_ACCEPTFILES) return 1;
     1901        return 0;
     1902
     1903    case WM_QUERYDRAGICON:
     1904        {
     1905            HICON hIcon = windowClass->getCursor();
     1906            UINT len;
     1907
     1908            if(hIcon) return (LRESULT)hIcon;
     1909            for(len = 1; len < 64; len++)
     1910            {
     1911              hIcon = LoadIconA(hInstance,MAKEINTRESOURCEA(len));
     1912              if(hIcon)
     1913                return (LRESULT)hIcon;
     1914            }
     1915            return (LRESULT)LoadIconA(0,IDI_APPLICATIONA);
     1916        }
     1917
    16141918    case WM_QUERYOPEN:
    16151919    case WM_QUERYENDSESSION:
     
    16371941            return result;
    16381942    }
     1943
    16391944    case WM_NOTIFY:
    16401945        return 0; //comctl32 controls expect this
     
    16441949            return 0;
    16451950        }
    1646         return 1;
     1951        return 1; //CB: shouldn't this be 0?
    16471952    }
    16481953}
     
    27443049  if(IsWindowDestroyed()) return;
    27453050
    2746   if (dwStyle != oldStyle) OSLibSetWindowStyle(OS2HwndFrame, dwStyle, fTaskList);
     3051  //CB: todo: dwExStyle, creating new frame controls, destroy not used, WS_VISIBLE, ...
     3052  //    write test cases
     3053  if (dwStyle & 0xFFFF0000 != oldStyle & 0xFFFF0000)
     3054    OSLibSetWindowStyle(OS2HwndFrame, dwStyle, fTaskList);
    27473055}
    27483056//******************************************************************************
     
    27803088                ss.styleOld = getStyle();
    27813089                        ss.styleNew = value | (ss.styleOld & (WS_VISIBLE | WS_CHILD));
    2782                 dprintf(("SetWindowLong GWL_STYLE %x old %x new style %x", getWindowHandle(), getStyle(), value));
     3090                dprintf(("SetWindowLong GWL_STYLE %x old %x new style %x", getWindowHandle(), ss.styleOld, ss.styleNew));
    27833091                SendInternalMessageA(WM_STYLECHANGING,GWL_STYLE,(LPARAM)&ss);
    27843092                setStyle(ss.styleNew);
Note: See TracChangeset for help on using the changeset viewer.