Ignore:
Timestamp:
Feb 6, 2000, 11:00:25 PM (26 years ago)
Author:
sandervl
Message:

DC changes + commented out shell position update

File:
1 edited

Legend:

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

    r2668 r2672  
    1 /* $Id: win32wbase.cpp,v 1.155 2000-02-06 17:39:34 cbratschi Exp $ */
     1/* $Id: win32wbase.cpp,v 1.156 2000-02-06 22:00:24 sandervl Exp $ */
    22/*
    33 * Win32 Window Base Class for OS/2
     
    146146  ownDC              = 0;
    147147  hWindowRegion      = 0;
    148   hUpdateRegion      = CreateRectRgn(0, 0, 0, 0);
     148  hClipRegion        = 0;
    149149
    150150  if(currentProcessId == -1)
     
    180180    }
    181181
    182     if(hUpdateRegion) {
    183         DeleteObject(hUpdateRegion);
    184         hUpdateRegion = 0;
    185     }
    186 
    187182    if(isOwnDC())
    188183        releaseOwnDC(ownDC);
     
    233228//******************************************************************************
    234229//******************************************************************************
     230#if 1
    235231BOOL Win32BaseWindow::CreateWindowExA(CREATESTRUCTA *cs, ATOM classAtom)
    236232{
    237233 char  buffer[256];
    238234 POINT maxSize, maxPos, minTrack, maxTrack;
    239  BOOL  xDefault = FALSE,cxDefault = FALSE;
    240235
    241236#ifdef DEBUG
     
    310305  if ((cs->x == CW_USEDEFAULT) || (cs->x == CW_USEDEFAULT16))
    311306  {
     307//        PDB *pdb = PROCESS_Current();
     308
    312309       /* Never believe Microsoft's documentation... CreateWindowEx doc says
    313310        * that if an overlapped window is created with WS_VISIBLE style bit
     
    329326
    330327        /* We have saved cs->y, now we can trash it */
     328#if 0
     329        if (   !(cs->style & (WS_CHILD | WS_POPUP))
     330            &&  (pdb->env_db->startup_info->dwFlags & STARTF_USEPOSITION) )
     331        {
     332            cs->x = pdb->env_db->startup_info->dwX;
     333            cs->y = pdb->env_db->startup_info->dwY;
     334        }
     335#endif
     336            cs->x = 0;
     337            cs->y = 0;
     338//        }
     339  }
     340  if ((cs->cx == CW_USEDEFAULT) || (cs->cx == CW_USEDEFAULT16))
     341  {
     342#if 0
     343        PDB *pdb = PROCESS_Current();
     344        if (   !(cs->style & (WS_CHILD | WS_POPUP))
     345            &&  (pdb->env_db->startup_info->dwFlags & STARTF_USESIZE) )
     346        {
     347            cs->cx = pdb->env_db->startup_info->dwXSize;
     348            cs->cy = pdb->env_db->startup_info->dwYSize;
     349        }
     350        else
     351        {
     352#endif
     353            cs->cx = 600; /* FIXME */
     354            cs->cy = 400;
     355//        }
     356  }
     357
     358  if (cs->x < 0) cs->x = 0;
     359  if (cs->y < 0) cs->y = 0;
     360
     361  //Allocate window words
     362  nrUserWindowLong = windowClass->getExtraWndWords();
     363  if(nrUserWindowLong) {
     364        userWindowLong = (ULONG *)_smalloc(nrUserWindowLong);
     365        memset(userWindowLong, 0, nrUserWindowLong);
     366  }
     367
     368  if ((cs->style & WS_CHILD) && cs->hwndParent)
     369  {
     370        SetParent(cs->hwndParent);
     371        owner = GetWindowFromHandle(cs->hwndParent);
     372        if(owner == NULL)
     373        {
     374            dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent));
     375            SetLastError(ERROR_INVALID_WINDOW_HANDLE);
     376            return FALSE;
     377        }
     378  }
     379  else
     380  {
     381        SetParent(0);
     382        if (!cs->hwndParent || (cs->hwndParent == windowDesktop->getWindowHandle())) {
     383            owner = NULL;
     384        }
     385        else
     386        {
     387            owner = GetWindowFromHandle(cs->hwndParent)->GetTopParent();
     388            if(owner == NULL)
     389            {
     390                dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent));
     391                SetLastError(ERROR_INVALID_WINDOW_HANDLE);
     392                return FALSE;
     393            }
     394        }
     395  }
     396
     397  WINPROC_SetProc((HWINDOWPROC *)&win32wndproc, windowClass->getWindowProc(), WINPROC_GetProcType(windowClass->getWindowProc()), WIN_PROC_WINDOW);
     398  hInstance = cs->hInstance;
     399  dwStyle   = cs->style & ~WS_VISIBLE;
     400  dwExStyle = cs->dwExStyle;
     401
     402  hwndLinkAfter = HWND_TOP;
     403  if(CONTROLS_IsControl(this, BUTTON_CONTROL) && ((dwStyle & 0x0f) == BS_GROUPBOX))
     404  {
     405        hwndLinkAfter = HWND_BOTTOM;
     406        dwStyle |= WS_CLIPSIBLINGS;
     407  }
     408  else
     409  if(CONTROLS_IsControl(this, STATIC_CONTROL) && !(dwStyle & WS_GROUP)) {
     410        dwStyle |= WS_CLIPSIBLINGS;
     411  }
     412
     413  /* Increment class window counter */
     414  windowClass->IncreaseWindowCount();
     415
     416  if (HOOK_IsHooked( WH_CBT ))
     417  {
     418        CBT_CREATEWNDA cbtc;
     419        LRESULT ret;
     420
     421        cbtc.lpcs = cs;
     422        cbtc.hwndInsertAfter = hwndLinkAfter;
     423        ret = HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND, getWindowHandle(), (LPARAM)&cbtc);
     424        if(ret)
     425        {
     426            dprintf(("CBT-hook returned 0!!"));
     427            SetLastError(ERROR_CAN_NOT_COMPLETE); //todo: wrong error
     428            return FALSE;
     429        }
     430  }
     431
     432  /* Correct the window style */
     433  if (!(cs->style & WS_CHILD))
     434  {
     435        dwStyle |= WS_CLIPSIBLINGS;
     436        if (!(cs->style & WS_POPUP))
     437        {
     438            dwStyle |= WS_CAPTION;
     439            flags |= WIN_NEED_SIZE;
     440        }
     441  }
     442  if (cs->dwExStyle & WS_EX_DLGMODALFRAME) dwStyle &= ~WS_THICKFRAME;
     443
     444  if (cs->style & WS_HSCROLL)
     445  {
     446        horzScrollInfo = (SCROLLBAR_INFO*)malloc(sizeof(SCROLLBAR_INFO));
     447        horzScrollInfo->MinVal = horzScrollInfo->CurVal = horzScrollInfo->Page = 0;
     448        horzScrollInfo->MaxVal = 100;
     449        horzScrollInfo->flags  = ESB_ENABLE_BOTH;
     450  }
     451
     452  if (cs->style & WS_VSCROLL)
     453  {
     454        vertScrollInfo = (SCROLLBAR_INFO*)malloc(sizeof(SCROLLBAR_INFO));
     455        vertScrollInfo->MinVal = vertScrollInfo->CurVal = vertScrollInfo->Page = 0;
     456        vertScrollInfo->MaxVal = 100;
     457        vertScrollInfo->flags  = ESB_ENABLE_BOTH;
     458  }
     459
     460  /* Send the WM_GETMINMAXINFO message and fix the size if needed */
     461  if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD)))
     462  {
     463        GetMinMaxInfo(&maxSize, &maxPos, &minTrack, &maxTrack);
     464        if (maxSize.x < cs->cx) cs->cx = maxSize.x;
     465        if (maxSize.y < cs->cy) cs->cy = maxSize.y;
     466        if (cs->cx < minTrack.x) cs->cx = minTrack.x;
     467        if (cs->cy < minTrack.y) cs->cy = minTrack.y;
     468  }
     469
     470  if(cs->style & WS_CHILD)
     471  {
     472        if(cs->cx < 0) cs->cx = 0;
     473        if(cs->cy < 0) cs->cy = 0;
     474  }
     475  else
     476  {
     477        if (cs->cx <= 0) cs->cx = 1;
     478        if (cs->cy <= 0) cs->cy = 1;
     479  }
     480
     481  if(((dwStyle & 0xC0000000) == WS_OVERLAPPED) && ((dwStyle & WS_CAPTION) == WS_CAPTION) && owner == NULL
     482     && dwStyle & WS_SYSMENU)
     483  {
     484        fTaskList = TRUE;
     485  }
     486
     487  DWORD dwOSWinStyle;
     488
     489  OSLibWinConvertStyle(dwStyle, dwExStyle, &dwOSWinStyle);
     490
     491  if(HIWORD(cs->lpszName))
     492  {
     493    if (!isUnicode)
     494    {
     495        wndNameLength = strlen(cs->lpszName);
     496        windowNameA = (LPSTR)_smalloc(wndNameLength+1);
     497        strcpy(windowNameA,cs->lpszName);
     498        windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
     499        lstrcpyAtoW(windowNameW,windowNameA);
     500        windowNameA[wndNameLength] = 0;
     501        windowNameW[wndNameLength] = 0;
     502    }
     503    else
     504    {
     505        wndNameLength = lstrlenW((LPWSTR)cs->lpszName);
     506        windowNameA = (LPSTR)_smalloc(wndNameLength+1);
     507        lstrcpyWtoA(windowNameA,(LPWSTR)cs->lpszName);
     508        windowNameW = (LPWSTR)_smalloc((wndNameLength+1)*sizeof(WCHAR));
     509        lstrcpyW(windowNameW,(LPWSTR)cs->lpszName);
     510        windowNameA[wndNameLength] = 0;
     511        windowNameW[wndNameLength] = 0;
     512    }
     513  }
     514
     515  //copy pointer of CREATESTRUCT for usage in MsgCreate method
     516  tmpcs = cs;
     517
     518  //Store our window object pointer in thread local memory, so PMWINDOW.CPP can retrieve it
     519  THDB *thdb = GetThreadTHDB();
     520
     521  if(thdb == NULL) {
     522        dprintf(("Window creation failed - thdb == NULL")); //this is VERY bad
     523        ExitProcess(666);
     524        return FALSE;
     525  }
     526
     527  thdb->newWindow = (ULONG)this;
     528
     529  OS2Hwnd = OSLibWinCreateWindow((getParent()) ? getParent()->getOS2WindowHandle() : OSLIB_HWND_DESKTOP,
     530                                 dwOSWinStyle,(char *)windowNameA,
     531                                 (owner) ? owner->getOS2WindowHandle() : OSLIB_HWND_DESKTOP,
     532                                 (hwndLinkAfter == HWND_BOTTOM) ? TRUE : FALSE,
     533                                 &OS2HwndFrame, 0, fTaskList, 0, windowClass->getStyle() & CS_SAVEBITS);
     534  if(OS2Hwnd == 0) {
     535        dprintf(("Window creation failed!!"));
     536        SetLastError(ERROR_OUTOFMEMORY); //TODO: Better error
     537        return FALSE;
     538  }
     539
     540  SetLastError(0);
     541  return TRUE;
     542}
     543#else
     544BOOL Win32BaseWindow::CreateWindowExA(CREATESTRUCTA *cs, ATOM classAtom)
     545{
     546 char  buffer[256];
     547 POINT maxSize, maxPos, minTrack, maxTrack;
     548 BOOL  xDefault = FALSE,cxDefault = FALSE;
     549
     550#ifdef DEBUG
     551    PrintWindowStyle(cs->style, cs->dwExStyle);
     552#endif
     553
     554    sw = SW_SHOW;
     555    SetLastError(0);
     556
     557    /* Find the parent window */
     558    if (cs->hwndParent)
     559    {
     560            Win32BaseWindow *window = GetWindowFromHandle(cs->hwndParent);
     561            if(!window) {
     562                    dprintf(("Bad parent %04x\n", cs->hwndParent ));
     563                    SetLastError(ERROR_INVALID_PARAMETER);
     564                    return FALSE;
     565            }
     566            /* Make sure parent is valid */
     567            if (!window->IsWindow() )
     568            {
     569                    dprintf(("Bad parent %04x\n", cs->hwndParent ));
     570                    SetLastError(ERROR_INVALID_PARAMETER);
     571                    return FALSE;
     572            }
     573    }
     574    else
     575    if ((cs->style & WS_CHILD) && !(cs->style & WS_POPUP)) {
     576            dprintf(("No parent for child window\n" ));
     577            SetLastError(ERROR_INVALID_PARAMETER);
     578            return FALSE;  /* WS_CHILD needs a parent, but WS_POPUP doesn't */
     579    }
     580
     581  /* Find the window class */
     582  windowClass = Win32WndClass::FindClass(cs->hInstance, (LPSTR)classAtom);
     583  if (!windowClass)
     584  {
     585        GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
     586        dprintf(("Bad class '%s'\n", buffer ));
     587        SetLastError(ERROR_INVALID_PARAMETER);
     588        return 0;
     589  }
     590#ifdef DEBUG
     591  if(HIWORD(cs->lpszClass))
     592  {
     593        char *astring;
     594
     595        if(isUnicode) astring = UnicodeToAsciiString((LPWSTR)cs->lpszClass);
     596        else          astring = (char *)cs->lpszClass;
     597
     598        dprintf(("Window class %s", astring));
     599        if(isUnicode) FreeAsciiString(astring);
     600  }
     601  else  dprintf(("Window class %x", cs->lpszClass));
     602#endif
     603
     604  /* Fix the lpszClass field: from existing programs, it seems ok to call a CreateWindowXXX
     605   * with an atom as the class name, put some programs expect to have a *REAL* string in
     606   * lpszClass when the CREATESTRUCT is sent with WM_CREATE
     607   */
     608  if (!HIWORD(cs->lpszClass) ) {
     609        if (isUnicode) {
     610                GlobalGetAtomNameW( classAtom, (LPWSTR)buffer, sizeof(buffer) );
     611        }
     612        else {
     613                GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) );
     614        }
     615        cs->lpszClass = buffer;
     616  }
     617
     618  /* Fix the coordinates */
     619  if ((cs->x == CW_USEDEFAULT) || (cs->x == CW_USEDEFAULT16))
     620  {
     621       /* Never believe Microsoft's documentation... CreateWindowEx doc says
     622        * that if an overlapped window is created with WS_VISIBLE style bit
     623        * set and the x parameter is set to CW_USEDEFAULT, the system ignores
     624        * the y parameter. However, disassembling NT implementation (WIN32K.SYS)
     625        * reveals that
     626        *
     627        * 1) not only if checks for CW_USEDEFAULT but also for CW_USEDEFAULT16
     628        * 2) it does not ignore the y parameter as the docs claim; instead, it
     629        *    uses it as second parameter to ShowWindow() unless y is either
     630        *    CW_USEDEFAULT or CW_USEDEFAULT16.
     631        *
     632        * The fact that we didn't do 2) caused bogus windows pop up when wine
     633        * was running apps that were using this obscure feature. Example -
     634        * calc.exe that comes with Win98 (only Win98, it's different from
     635        * the one that comes with Win95 and NT)
     636        */
     637        if ((cs->y != CW_USEDEFAULT) && (cs->y != CW_USEDEFAULT16)) sw = cs->y;
     638
     639        /* We have saved cs->y, now we can trash it */
    331640        cs->x = 0;
    332641        cs->y = 0;
     
    539848  return TRUE;
    540849}
     850#endif
    541851//******************************************************************************
    542852//******************************************************************************
     
    572882  /* Get class or window DC if needed */
    573883  if(windowClass->getStyle() & CS_OWNDC) {
    574     dprintf(("Class with CS_OWNDC style"));
    575 //    ownDC = GetWindowDC(getWindowHandle());
     884        dprintf(("Class with CS_OWNDC style"));
     885        ownDC = GetDC(getWindowHandle()); //TODO: or GetWindowDC???
    576886  }
    577887  else
    578888  if (windowClass->getStyle() & CS_PARENTDC)  {
    579     dprintf(("WARNING: Class with CS_PARENTDC style!"));
    580     fParentDC = TRUE;
    581     ownDC = 0;
     889        dprintf(("WARNING: Class with CS_PARENTDC style!"));
     890        fParentDC = TRUE;
     891        ownDC = 0;
    582892  }
    583893  else
    584894  if (windowClass->getStyle() & CS_CLASSDC)  {
    585     dprintf(("WARNING: Class with CS_CLASSDC style!"));
    586     ownDC = 0;
     895        dprintf(("WARNING: Class with CS_CLASSDC style!"));
     896        ownDC = 0;
    587897  }
    588898  /* Set the window menu */
     
    14351745        if (!windowClass || !windowClass->getBackgroundBrush()) return 0;
    14361746
    1437 //        rc = GetClipBox( (HDC)wParam, &rect );
    1438         rc = GetRgnBox(hUpdateRegion, &rect);
     1747        rc = GetClipBox( (HDC)wParam, &rect );
    14391748        if ((rc == SIMPLEREGION) || (rc == COMPLEXREGION))
    14401749        {
     
    14441753                hBrush = GetSysColorBrush(hBrush-1);
    14451754
    1446 //          FillRect( (HDC)wParam, &rect, hBrush);
    1447                 FillRgn((HDC)wParam, hUpdateRegion, hBrush);
    1448         }
    1449 
     1755            FillRect( (HDC)wParam, &rect, hBrush);
     1756        }
    14501757        return 1;
    14511758    }
     
    15931900            break;
    15941901    }
    1595 
    15961902    case WM_SETHOTKEY:
    15971903        hotkey = wParam;
Note: See TracChangeset for help on using the changeset viewer.