Changeset 745 for trunk/src/user32/new/win32wbase.cpp
- Timestamp:
- Aug 30, 1999, 6:38:59 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/new/win32wbase.cpp
r741 r745 1 /* $Id: win32wbase.cpp,v 1. 1 1999-08-30 12:00:12 sandervlExp $ */1 /* $Id: win32wbase.cpp,v 1.2 1999-08-30 16:38:59 dengert Exp $ */ 2 2 /* 3 3 * Win32 Window Base Class for OS/2 … … 60 60 //****************************************************************************** 61 61 Win32BaseWindow::Win32BaseWindow(CREATESTRUCTA *lpCreateStructA, ATOM classAtom, BOOL isUnicode) 62 62 : GenericObject(&windows, OBJTYPE_WINDOW), ChildWindow() 63 63 { 64 64 Init(); … … 70 70 void Win32BaseWindow::Init() 71 71 { 72 isUnicode 73 fCreated 74 fFirstShow 75 76 windowNameA 77 windowNameW 72 isUnicode = FALSE; 73 fCreated = FALSE; 74 fFirstShow = TRUE; 75 76 windowNameA = NULL; 77 windowNameW = NULL; 78 78 wndNameLength = 0; 79 79 … … 81 81 nrUserWindowLong = 0; 82 82 83 magic 84 OS2Hwnd 85 OS2HwndFrame 86 OS2HwndMenu 87 Win32Hwnd 83 magic = WIN32PM_MAGIC; 84 OS2Hwnd = 0; 85 OS2HwndFrame = 0; 86 OS2HwndMenu = 0; 87 Win32Hwnd = 0; 88 88 89 89 if(HwAllocateWindowHandle(&Win32Hwnd, (ULONG)this) == FALSE) 90 90 { 91 92 93 } 94 95 posx = posy 91 dprintf(("Win32BaseWindow::Init HwAllocateWindowHandle failed!!")); 92 DebugInt3(); 93 } 94 95 posx = posy = 0; 96 96 width = height = 0; 97 97 98 dwExStyle 99 dwStyle 100 win32wndproc 101 hInstance 102 windowId = 0xFFFFFFFF;//default = -1103 userData 98 dwExStyle = 0; 99 dwStyle = 0; 100 win32wndproc = 0; 101 hInstance = 0; 102 windowId = 0xFFFFFFFF; //default = -1 103 userData = 0; 104 104 105 105 hwndLinkAfter = HWND_BOTTOM; 106 flags 107 isIcon 106 flags = 0; 107 isIcon = FALSE; 108 108 lastHitTestVal = 0; 109 owner 110 windowClass 109 owner = NULL; 110 windowClass = 0; 111 111 112 112 acceltableResource = NULL; 113 menuResource 114 iconResource 113 menuResource = NULL; 114 iconResource = NULL; 115 115 } 116 116 //****************************************************************************** … … 123 123 124 124 if(Win32Hwnd) 125 125 HwFreeWindowHandle(Win32Hwnd); 126 126 127 127 if(userWindowLong) 128 128 free(userWindowLong); 129 129 if(windowNameA) { 130 131 130 free(windowNameA); 131 windowNameA = NULL; 132 132 } 133 133 if(windowNameW) { 134 135 134 free(windowNameW); 135 windowNameW = NULL; 136 136 } 137 137 } … … 155 155 if (cs->hwndParent) 156 156 { 157 158 159 160 161 162 163 164 165 166 167 168 169 157 Win32BaseWindow *window = GetWindowFromHandle(cs->hwndParent); 158 if(!window) { 159 dprintf(("Bad parent %04x\n", cs->hwndParent )); 160 SetLastError(ERROR_INVALID_PARAMETER); 161 return FALSE; 162 } 163 /* Make sure parent is valid */ 164 if (!window->IsWindow() ) 165 { 166 dprintf(("Bad parent %04x\n", cs->hwndParent )); 167 SetLastError(ERROR_INVALID_PARAMETER); 168 return FALSE; 169 } 170 170 } 171 171 else 172 172 if ((cs->style & WS_CHILD) && !(cs->style & WS_POPUP)) { 173 174 175 173 dprintf(("No parent for child window\n" )); 174 SetLastError(ERROR_INVALID_PARAMETER); 175 return FALSE; /* WS_CHILD needs a parent, but WS_POPUP doesn't */ 176 176 } 177 177 … … 180 180 if (!windowClass) 181 181 { 182 183 184 182 GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) ); 183 dprintf(("Bad class '%s'\n", buffer )); 184 return 0; 185 185 } 186 186 … … 190 190 */ 191 191 if (!HIWORD(cs->lpszClass) ) { 192 193 194 195 196 197 198 192 if (isUnicode) { 193 GlobalGetAtomNameW( classAtom, (LPWSTR)buffer, sizeof(buffer) ); 194 } 195 else { 196 GlobalGetAtomNameA( classAtom, buffer, sizeof(buffer) ); 197 } 198 cs->lpszClass = buffer; 199 199 } 200 200 … … 202 202 if (cs->x == CW_USEDEFAULT || cs->x == CW_USEDEFAULT16) 203 203 { 204 // 204 // PDB *pdb = PROCESS_Current(); 205 205 206 206 /* Never believe Microsoft's documentation... CreateWindowEx doc says 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 207 * that if an overlapped window is created with WS_VISIBLE style bit 208 * set and the x parameter is set to CW_USEDEFAULT, the system ignores 209 * the y parameter. However, disassembling NT implementation (WIN32K.SYS) 210 * reveals that 211 * 212 * 1) not only if checks for CW_USEDEFAULT but also for CW_USEDEFAULT16 213 * 2) it does not ignore the y parameter as the docs claim; instead, it 214 * uses it as second parameter to ShowWindow() unless y is either 215 * CW_USEDEFAULT or CW_USEDEFAULT16. 216 * 217 * The fact that we didn't do 2) caused bogus windows pop up when wine 218 * was running apps that were using this obscure feature. Example - 219 * calc.exe that comes with Win98 (only Win98, it's different from 220 * the one that comes with Win95 and NT) 221 */ 222 if (cs->y != CW_USEDEFAULT && cs->y != CW_USEDEFAULT16) sw = cs->y; 223 224 /* We have saved cs->y, now we can trash it */ 225 225 #if 0 226 227 &&(pdb->env_db->startup_info->dwFlags & STARTF_USEPOSITION) )228 229 230 231 226 if ( !(cs->style & (WS_CHILD | WS_POPUP)) 227 && (pdb->env_db->startup_info->dwFlags & STARTF_USEPOSITION) ) 228 { 229 cs->x = pdb->env_db->startup_info->dwX; 230 cs->y = pdb->env_db->startup_info->dwY; 231 } 232 232 #endif 233 234 235 // 233 cs->x = 0; 234 cs->y = 0; 235 // } 236 236 } 237 237 if (cs->cx == CW_USEDEFAULT || cs->cx == CW_USEDEFAULT16) 238 238 { 239 239 #if 0 240 241 242 &&(pdb->env_db->startup_info->dwFlags & STARTF_USESIZE) )243 244 245 246 247 248 240 PDB *pdb = PROCESS_Current(); 241 if ( !(cs->style & (WS_CHILD | WS_POPUP)) 242 && (pdb->env_db->startup_info->dwFlags & STARTF_USESIZE) ) 243 { 244 cs->cx = pdb->env_db->startup_info->dwXSize; 245 cs->cy = pdb->env_db->startup_info->dwYSize; 246 } 247 else 248 { 249 249 #endif 250 251 252 // 250 cs->cx = 600; /* FIXME */ 251 cs->cy = 400; 252 // } 253 253 } 254 254 … … 259 259 nrUserWindowLong = windowClass->getExtraWndWords(); 260 260 if(nrUserWindowLong) { 261 262 261 userWindowLong = (ULONG *)_smalloc(nrUserWindowLong); 262 memset(userWindowLong, 0, nrUserWindowLong); 263 263 } 264 264 265 265 if ((cs->style & WS_CHILD) && cs->hwndParent) 266 266 { 267 268 269 270 271 272 273 267 SetParent(cs->hwndParent); 268 owner = GetWindowFromHandle(cs->hwndParent); 269 if(owner == NULL) 270 { 271 dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent)); 272 return FALSE; 273 } 274 274 } 275 275 else 276 276 { 277 278 279 280 281 282 283 284 285 286 287 288 277 if (!cs->hwndParent) { 278 owner = NULL; 279 } 280 else 281 { 282 owner = GetWindowFromHandle(cs->hwndParent); 283 if(owner == NULL) 284 { 285 dprintf(("HwGetWindowHandleData couldn't find owner window %x!!!", cs->hwndParent)); 286 return FALSE; 287 } 288 } 289 289 } 290 290 … … 295 295 296 296 hwndLinkAfter = ((cs->style & (WS_CHILD|WS_MAXIMIZE)) == WS_CHILD) 297 297 ? HWND_BOTTOM : HWND_TOP; 298 298 299 299 #if 0 … … 304 304 { 305 305 CBT_CREATEWNDA cbtc; 306 306 LRESULT ret; 307 307 308 308 cbtc.lpcs = cs; 309 309 cbtc.hwndInsertAfter = hwndLinkAfter; 310 311 312 310 ret = unicode ? HOOK_CallHooksW(WH_CBT, HCBT_CREATEWND, Win32Hwnd, (LPARAM)&cbtc) 311 : HOOK_CallHooksA(WH_CBT, HCBT_CREATEWND, Win32Hwnd, (LPARAM)&cbtc); 312 if (ret) 313 313 { 314 315 316 retvalue =0;317 314 TRACE_(win)("CBT-hook returned 0\n"); 315 wndPtr->pDriver->pFinalize(wndPtr); 316 retvalue = 0; 317 goto end; 318 318 } 319 319 } … … 326 326 if (!(cs->style & WS_CHILD)) 327 327 { 328 329 330 331 332 333 328 dwStyle |= WS_CLIPSIBLINGS; 329 if (!(cs->style & WS_POPUP)) 330 { 331 dwStyle |= WS_CAPTION; 332 flags |= WIN_NEED_SIZE; 333 } 334 334 } 335 335 if (cs->dwExStyle & WS_EX_DLGMODALFRAME) dwStyle &= ~WS_THICKFRAME; … … 346 346 if ((cs->style & WS_THICKFRAME) || !(cs->style & (WS_POPUP | WS_CHILD))) 347 347 { 348 349 350 351 352 348 GetMinMaxInfo(&maxSize, &maxPos, &minTrack, &maxTrack); 349 if (maxSize.x < cs->cx) cs->cx = maxSize.x; 350 if (maxSize.y < cs->cy) cs->cy = maxSize.y; 351 if (cs->cx < minTrack.x ) cs->cx = minTrack.x; 352 if (cs->cy < minTrack.y ) cs->cy = minTrack.y; 353 353 } 354 354 355 355 if(cs->style & WS_CHILD) 356 356 { 357 358 357 if(cs->cx < 0) cs->cx = 0; 358 if(cs->cy < 0) cs->cy = 0; 359 359 } 360 360 else 361 361 { 362 363 362 if (cs->cx <= 0) cs->cx = 1; 363 if (cs->cy <= 0) cs->cy = 1; 364 364 } 365 365 … … 368 368 rectWindow.right = cs->x + cs->cx; 369 369 rectWindow.bottom = cs->y + cs->cy; 370 rectClient 370 rectClient = rectWindow; 371 371 372 372 DWORD dwOSWinStyle, dwOSFrameStyle; … … 377 377 #if 1 378 378 if(cs->style & WS_CHILD) { 379 379 dwOSFrameStyle = 0; 380 380 } 381 381 #endif 382 382 383 383 if(cs->lpszName) 384 384 SetWindowText((LPSTR)cs->lpszName); 385 385 386 386 OS2Hwnd = OSLibWinCreateWindow((getParent()) ? getParent()->getOS2WindowHandle() : OSLIB_HWND_DESKTOP, 387 388 389 390 387 dwOSWinStyle, dwOSFrameStyle, (char *)windowNameA, 388 (owner) ? owner->getOS2WindowHandle() : OSLIB_HWND_DESKTOP, 389 (hwndLinkAfter == HWND_BOTTOM) ? TRUE : FALSE, 390 &OS2HwndFrame); 391 391 392 392 if(OS2Hwnd == 0) { 393 394 393 dprintf(("Window creation failed!!")); 394 return FALSE; 395 395 } 396 396 397 397 if(OSLibWinSetWindowULong(OS2Hwnd, OFFSET_WIN32WNDPTR, (ULONG)this) == FALSE) { 398 399 398 dprintf(("WM_CREATE: WinSetWindowULong %X failed!!", OS2Hwnd)); 399 return FALSE; 400 400 } 401 401 if(OSLibWinSetWindowULong(OS2Hwnd, OFFSET_WIN32PM_MAGIC, WIN32PM_MAGIC) == FALSE) { 402 403 402 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2Hwnd)); 403 return FALSE; 404 404 } 405 405 //SvL: Need to store the shared memory base, or else other apps can map it into their memory space 406 406 if(OSLibWinSetWindowULong(OS2Hwnd, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) { 407 408 407 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2Hwnd)); 408 return FALSE; 409 409 } 410 410 #if 0 411 411 if(OS2Hwnd != OS2HwndFrame) { 412 412 if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32WNDPTR, (ULONG)this) == FALSE) { 413 414 413 dprintf(("WM_CREATE: WinSetWindowULong %X failed!!", OS2HwndFrame)); 414 return FALSE; 415 415 } 416 416 if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_MAGIC, WIN32PM_MAGIC) == FALSE) { 417 418 417 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame)); 418 return FALSE; 419 419 } 420 420 //SvL: Need to store the shared memory base, or else other apps can map it into their memory space 421 421 if(OSLibWinSetWindowULong(OS2HwndFrame, OFFSET_WIN32PM_SHAREDMEM, HeapGetSharedMemBase()) == FALSE) { 422 423 422 dprintf(("WM_CREATE: WinSetWindowULong2 %X failed!!", OS2HwndFrame)); 423 return FALSE; 424 424 } 425 425 } … … 429 429 if ((dwStyle & (WS_CAPTION | WS_CHILD)) == WS_CAPTION ) 430 430 { 431 432 433 434 435 436 437 438 439 } 440 else 431 if (cs->hMenu) SetMenu(cs->hMenu); 432 else 433 { 434 if (windowClass->getMenuNameA()) { 435 cs->hMenu = LoadMenuA(cs->hInstance, windowClass->getMenuNameA()); 436 if (cs->hMenu) SetMenu(cs->hMenu ); 437 } 438 } 439 } 440 else windowId = (UINT)cs->hMenu; 441 441 442 442 //Set icon from class 443 443 if(windowClass->getIcon()) 444 444 SetIcon(windowClass->getIcon()); 445 445 446 446 if(getParent()) { 447 448 449 450 447 SetWindowPos(getParent()->getWindowHandle(), rectClient.left, rectClient.top, 448 rectClient.right-rectClient.left, 449 rectClient.bottom-rectClient.top, 450 SWP_NOACTIVATE | SWP_NOZORDER); 451 451 } 452 452 else { 453 454 455 456 453 SetWindowPos(HWND_TOP, rectClient.left, rectClient.top, 454 rectClient.right-rectClient.left, 455 rectClient.bottom-rectClient.top, 456 SWP_NOACTIVATE); 457 457 } 458 458 //Get the client window rectangle … … 468 468 if(SendInternalMessage(WM_NCCREATE, 0, (LPARAM)cs) ) 469 469 { 470 470 //doesn't work right, messes up client rectangle 471 471 #if 0 472 472 SendNCCalcSize(FALSE, &rectWindow, NULL, NULL, 0, &rectClient ); 473 473 #endif 474 475 476 477 478 479 480 481 482 483 484 474 OffsetRect(&rectWindow, maxPos.x - rectWindow.left, maxPos.y - rectWindow.top); 475 dprintf(("Sending WM_CREATE")); 476 if( (SendInternalMessage(WM_CREATE, 0, (LPARAM)cs )) != -1 ) 477 { 478 if(!(flags & WIN_NEED_SIZE)) { 479 SendMessageA(WM_SIZE, SIZE_RESTORED, 480 MAKELONG(rectClient.right-rectClient.left, 481 rectClient.bottom-rectClient.top)); 482 SendMessageA(WM_MOVE, 0, MAKELONG( rectClient.left, rectClient.top ) ); 483 } 484 if (cs->style & WS_VISIBLE) ShowWindow( sw ); 485 485 486 486 #if 0 487 488 489 490 487 /* Call WH_SHELL hook */ 488 489 if (!(dwStyle & WS_CHILD) && !owner) 490 HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 ); 491 491 #endif 492 493 494 492 SetLastError(0); 493 return TRUE; 494 } 495 495 } 496 496 fCreated = FALSE; … … 502 502 #if 0 503 503 /*********************************************************************** 504 * 504 * WINPOS_MinMaximize 505 505 * 506 506 * Fill in lpRect and return additional flags to be used with SetWindowPos(). … … 521 521 if( dwStyle & WS_MINIMIZE ) 522 522 { 523 524 525 523 if( !SendInternalMessageA(WM_QUERYOPEN, 0, 0L ) ) 524 return (SWP_NOSIZE | SWP_NOMOVE); 525 swpFlags |= SWP_NOCOPYBITS; 526 526 } 527 527 switch( cmd ) 528 528 { 529 530 531 532 533 534 535 536 537 529 case SW_MINIMIZE: 530 if( dwStyle & WS_MAXIMIZE) 531 { 532 flags |= WIN_RESTORE_MAX; 533 dwStyle &= ~WS_MAXIMIZE; 534 } 535 else 536 flags &= ~WIN_RESTORE_MAX; 537 dwStyle |= WS_MINIMIZE; 538 538 539 539 #if 0 540 541 542 540 if( flags & WIN_NATIVE ) 541 if( pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, TRUE ) ) 542 swpFlags |= MINMAX_NOSWP; 543 543 #endif 544 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 545 lpPos->ptIconPos = WINPOS_FindIconPos( wndPtr, lpPos->ptIconPos ); 546 547 SetRect(lpRect, lpPos->ptIconPos.x, lpPos->ptIconPos.y, 548 GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CYICON) ); 549 swpFlags |= SWP_NOCOPYBITS; 550 break; 551 552 case SW_MAXIMIZE: 553 WINPOS_GetMinMaxInfo( wndPtr, &size, &pt, NULL, NULL ); 554 555 if( dwStyle & WS_MINIMIZE ) 556 { 557 if( flags & WIN_NATIVE ) 558 if( pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, FALSE ) ) 559 swpFlags |= MINMAX_NOSWP; 560 561 WINPOS_ShowIconTitle( wndPtr, FALSE ); 562 dwStyle &= ~WS_MINIMIZE; 563 } 564 dwStyle |= WS_MAXIMIZE; 565 566 SetRect16( lpRect, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y, 567 size.x, size.y ); 568 break; 569 570 case SW_RESTORE: 571 if( dwStyle & WS_MINIMIZE ) 572 { 573 if( flags & WIN_NATIVE ) 574 if( pDriver->pSetHostAttr( wndPtr, HAK_ICONICSTATE, FALSE ) ) 575 swpFlags |= MINMAX_NOSWP; 576 577 dwStyle &= ~WS_MINIMIZE; 578 WINPOS_ShowIconTitle( wndPtr, FALSE ); 579 580 if( flags & WIN_RESTORE_MAX) 581 { 582 /* Restore to maximized position */ 583 CONV_POINT16TO32( &lpPos->ptMaxPos, &pt ); 584 WINPOS_GetMinMaxInfo( wndPtr, &size, &pt, NULL, NULL); 585 CONV_POINT32TO16( &pt, &lpPos->ptMaxPos ); 586 dwStyle |= WS_MAXIMIZE; 587 SetRect16( lpRect, lpPos->ptMaxPos.x, lpPos->ptMaxPos.y, size.x, size.y ); 588 break; 589 } 590 } 591 else 592 if( !(dwStyle & WS_MAXIMIZE) ) return (UINT16)(-1); 593 else dwStyle &= ~WS_MAXIMIZE; 594 595 /* Restore to normal position */ 596 597 *lpRect = lpPos->rectNormal; 598 lpRect->right -= lpRect->left; 599 lpRect->bottom -= lpRect->top; 600 601 break; 602 602 } 603 603 } else swpFlags |= SWP_NOSIZE | SWP_NOMOVE; … … 606 606 #endif 607 607 /******************************************************************* 608 * 608 * GetMinMaxInfo 609 609 * 610 610 * Get the minimized and maximized information for a window. 611 611 */ 612 612 void Win32BaseWindow::GetMinMaxInfo(POINT *maxSize, POINT *maxPos, 613 613 POINT *minTrack, POINT *maxTrack ) 614 614 { 615 615 MINMAXINFO MinMax; … … 628 628 else if (HAS_DLGFRAME( dwStyle, dwExStyle )) 629 629 { 630 631 630 xinc = GetSystemMetrics(SM_CXDLGFRAME); 631 yinc = GetSystemMetrics(SM_CYDLGFRAME); 632 632 } 633 633 else 634 634 { 635 636 637 638 639 640 641 642 643 644 645 635 xinc = yinc = 0; 636 if (HAS_THICKFRAME(dwStyle)) 637 { 638 xinc += GetSystemMetrics(SM_CXFRAME); 639 yinc += GetSystemMetrics(SM_CYFRAME); 640 } 641 if (dwStyle & WS_BORDER) 642 { 643 xinc += GetSystemMetrics(SM_CXBORDER); 644 yinc += GetSystemMetrics(SM_CYBORDER); 645 } 646 646 } 647 647 MinMax.ptMaxSize.x += 2 * xinc; … … 651 651 lpPos = (LPINTERNALPOS)GetPropA( hwndSelf, atomInternalPos ); 652 652 if( lpPos && !EMPTYPOINT(lpPos->ptMaxPos) ) 653 653 CONV_POINT16TO32( &lpPos->ptMaxPos, &MinMax.ptMaxPosition ); 654 654 else 655 655 { 656 656 #endif 657 658 657 MinMax.ptMaxPosition.x = -xinc; 658 MinMax.ptMaxPosition.y = -yinc; 659 659 // } 660 660 … … 664 664 665 665 dprintf(("GetMinMaxInfo: %ld %ld / %ld %ld / %ld %ld / %ld %ld\n", 666 667 668 669 666 MinMax.ptMaxSize.x, MinMax.ptMaxSize.y, 667 MinMax.ptMaxPosition.x, MinMax.ptMaxPosition.y, 668 MinMax.ptMaxTrackSize.x, MinMax.ptMaxTrackSize.y, 669 MinMax.ptMinTrackSize.x, MinMax.ptMinTrackSize.y)); 670 670 MinMax.ptMaxTrackSize.x = MAX( MinMax.ptMaxTrackSize.x, 671 671 MinMax.ptMinTrackSize.x ); 672 672 MinMax.ptMaxTrackSize.y = MAX( MinMax.ptMaxTrackSize.y, 673 673 MinMax.ptMinTrackSize.y ); 674 674 675 675 if (maxSize) *maxSize = MinMax.ptMaxSize; … … 679 679 } 680 680 /*********************************************************************** 681 * 681 * WINPOS_SendNCCalcSize 682 682 * 683 683 * Send a WM_NCCALCSIZE message to a window. … … 687 687 */ 688 688 LONG Win32BaseWindow::SendNCCalcSize(BOOL calcValidRect, RECT *newWindowRect, RECT *oldWindowRect, 689 690 689 RECT *oldClientRect, WINDOWPOS *winpos, 690 RECT *newClientRect ) 691 691 { 692 692 NCCALCSIZE_PARAMS params; … … 697 697 if (calcValidRect) 698 698 { 699 700 701 702 699 winposCopy = *winpos; 700 params.rgrc[1] = *oldWindowRect; 701 params.rgrc[2] = *oldClientRect; 702 params.lppos = &winposCopy; 703 703 } 704 704 result = SendInternalMessageA(WM_NCCALCSIZE, calcValidRect, 705 705 (LPARAM)¶ms ); 706 706 *newClientRect = params.rgrc[0]; 707 707 return result; … … 725 725 { 726 726 if(SendInternalMessageA(WM_CLOSE, 0, 0) == 0) { 727 727 return 0; //app handles this message 728 728 } 729 729 delete this; … … 760 760 #if 1 761 761 if(fCreated == FALSE) { 762 762 return 1; 763 763 } 764 764 #endif … … 772 772 #if 1 773 773 if(fCreated == FALSE) { 774 774 return 1; 775 775 } 776 776 #endif … … 783 783 dprintf(("MsgMove to (%d,%d)", x, y)); 784 784 if(fCreated == FALSE) { 785 785 return 1; 786 786 } 787 787 … … 794 794 switch(cmd) { 795 795 case CMD_MENU: 796 796 return SendInternalMessageA(WM_COMMAND, MAKELONG(Id, 0), 0); 797 797 case CMD_CONTROL: 798 798 return 0; //todo 799 799 case CMD_ACCELERATOR: 800 801 800 dprintf(("accelerator command")); 801 return 0; //todo 802 802 } 803 803 return 0; … … 818 818 819 819 if(fCreated == FALSE) {//Solitaire crashes if it receives a WM_SIZE during CreateWindowEx (normal or our fault?) 820 820 return 1; 821 821 } 822 822 823 823 if(fMinimize) { 824 824 fwSizeType = SIZE_MINIMIZED; 825 825 } 826 826 else 827 827 if(fMaximize) { 828 828 fwSizeType = SIZE_MAXIMIZED; 829 829 } 830 830 else fwSizeType = SIZE_RESTORED; … … 838 838 if(SendInternalMessageA(WM_NCACTIVATE, fActivate, 0) == FALSE) 839 839 { 840 841 842 840 if(!fActivate) { 841 return 1; 842 } 843 843 } 844 844 return SendInternalMessageA(WM_ACTIVATE, (fActivate) ? WA_ACTIVE : WA_INACTIVE, hwnd); … … 860 860 lParam |= (scancode << 16); 861 861 if(keyflags & KEY_ALTDOWN) 862 862 lParam |= (1<<29); 863 863 if(keyflags & KEY_PREVDOWN) 864 864 lParam |= (1<<30); 865 865 if(keyflags & KEY_UP) 866 866 lParam |= (1<<31); 867 867 if(keyflags & KEY_DEADKEY) { 868 869 868 dprintf(("WM_DEADCHAR: %x %x %08x", OS2Hwnd, cmd, lParam)); 869 return SendInternalMessageA(WM_DEADCHAR, cmd, lParam); 870 870 } 871 871 else { 872 873 872 dprintf(("WM_CHAR: %x %x %08x", OS2Hwnd, cmd, lParam)); 873 return SendInternalMessageA(WM_CHAR, cmd, lParam); 874 874 } 875 875 } … … 879 879 { 880 880 if(hwnd == 0) { 881 882 881 //other app lost focus 882 SendInternalMessageA(WM_ACTIVATEAPP, TRUE, 0); //TODO: Need thread id from hwnd app 883 883 } 884 884 return SendInternalMessageA(WM_SETFOCUS, hwnd, 0); … … 889 889 { 890 890 if(hwnd == 0) { 891 892 891 //other app lost focus 892 SendInternalMessageA(WM_ACTIVATEAPP, FALSE, 0); //TODO: Need thread id from hwnd app 893 893 } 894 894 return SendInternalMessageA(WM_KILLFOCUS, hwnd, 0); … … 903 903 dprintf(("MsgButton to (%d,%d)", ncx, ncy)); 904 904 switch(msg) { 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 905 case BUTTON_LEFTDOWN: 906 win32msg = WM_LBUTTONDOWN; 907 win32ncmsg = WM_NCLBUTTONDOWN; 908 break; 909 case BUTTON_LEFTUP: 910 win32msg = WM_LBUTTONUP; 911 win32ncmsg = WM_NCLBUTTONUP; 912 break; 913 case BUTTON_LEFTDBLCLICK: 914 win32msg = WM_LBUTTONDBLCLK; 915 win32ncmsg = WM_NCLBUTTONDBLCLK; 916 break; 917 case BUTTON_RIGHTUP: 918 win32msg = WM_RBUTTONUP; 919 win32ncmsg = WM_NCRBUTTONUP; 920 break; 921 case BUTTON_RIGHTDOWN: 922 win32msg = WM_RBUTTONDOWN; 923 win32ncmsg = WM_NCRBUTTONDOWN; 924 break; 925 case BUTTON_RIGHTDBLCLICK: 926 win32msg = WM_RBUTTONDBLCLK; 927 win32ncmsg = WM_NCRBUTTONDBLCLK; 928 break; 929 case BUTTON_MIDDLEUP: 930 win32msg = WM_MBUTTONUP; 931 win32ncmsg = WM_NCMBUTTONUP; 932 break; 933 case BUTTON_MIDDLEDOWN: 934 win32msg = WM_MBUTTONDOWN; 935 win32ncmsg = WM_NCMBUTTONDOWN; 936 break; 937 case BUTTON_MIDDLEDBLCLICK: 938 win32msg = WM_MBUTTONDBLCLK; 939 win32ncmsg = WM_NCMBUTTONDBLCLK; 940 break; 941 default: 942 dprintf(("Win32BaseWindow::Button: invalid msg!!!!")); 943 return 1; 944 944 } 945 945 if(win32msg == WM_MBUTTONDBLCLK || win32msg == WM_RBUTTONDBLCLK || win32msg == WM_LBUTTONDBLCLK) { 946 947 948 946 if(!(windowClass->getClassLongA(GCL_STYLE) & CS_DBLCLKS)) { 947 return 1; 948 } 949 949 } 950 950 SendInternalMessageA(WM_SETCURSOR, Win32Hwnd, MAKELONG(lastHitTestVal, win32ncmsg)); … … 952 952 //WM_NC*BUTTON* is posted when the cursor is in a non-client area of the window 953 953 if(lastHitTestVal != HTCLIENT) { 954 954 SendInternalMessageA(win32ncmsg, lastHitTestVal, MAKELONG(ncx, ncy)); //TODO: 955 955 } 956 956 return SendInternalMessageA(win32msg, 0, MAKELONG(clx, cly)); … … 964 964 965 965 if(keystate & WMMOVE_LBUTTON) 966 966 winstate |= MK_LBUTTON; 967 967 if(keystate & WMMOVE_RBUTTON) 968 968 winstate |= MK_RBUTTON; 969 969 if(keystate & WMMOVE_MBUTTON) 970 970 winstate |= MK_MBUTTON; 971 971 if(keystate & WMMOVE_SHIFT) 972 972 winstate |= MK_SHIFT; 973 973 if(keystate & WMMOVE_CTRL) 974 974 winstate |= MK_CONTROL; 975 975 976 976 if(lastHitTestVal != HTCLIENT) { 977 977 setcursormsg = WM_NCMOUSEMOVE; 978 978 } 979 979 //TODO: hiword should be 0 if window enters menu mode (SDK docs) … … 982 982 //WM_NCMOUSEMOVE is posted when the cursor moves into a non-client area of the window 983 983 if(lastHitTestVal != HTCLIENT) { 984 984 SendInternalMessageA(WM_NCMOUSEMOVE, lastHitTestVal, MAKELONG(x, y)); 985 985 } 986 986 return SendInternalMessageA(WM_MOUSEMOVE, keystate, MAKELONG(x, y)); … … 994 994 //****************************************************************************** 995 995 //TODO: Is the clipper region of the window DC equal to the invalidated rectangle? 996 // 996 // (or are we simply erasing too much here) 997 997 //****************************************************************************** 998 998 ULONG Win32BaseWindow::MsgEraseBackGround(HDC hdc) … … 1002 1002 1003 1003 if (hdcErase == 0) 1004 1004 hdcErase = O32_GetDC(OS2Hwnd); 1005 1005 1006 1006 if(isIcon) 1007 1007 rc = SendInternalMessageA(WM_ICONERASEBKGND, hdcErase, 0); 1008 1008 else 1009 1009 rc = SendInternalMessageA(WM_ERASEBKGND, hdcErase, 0); 1010 1010 if (hdc == 0) 1011 1011 O32_ReleaseDC(OS2Hwnd, hdcErase); 1012 1012 return (rc); 1013 1013 } … … 1017 1017 { 1018 1018 if(isUnicode) { 1019 1019 return SendInternalMessageW(WM_SETTEXT, 0, (LPARAM)lpsz); 1020 1020 } 1021 1021 else return SendInternalMessageA(WM_SETTEXT, 0, (LPARAM)lpsz); … … 1033 1033 { 1034 1034 if(isUnicode) { 1035 1035 SendInternalMessageW(WM_GETTEXT, wndNameLength, (LPARAM)windowNameW); 1036 1036 } 1037 1037 else { 1038 1038 SendInternalMessageA(WM_GETTEXT, wndNameLength, (LPARAM)windowNameA); 1039 1039 } 1040 1040 return windowNameA; … … 1047 1047 { 1048 1048 case WM_GETTEXTLENGTH: 1049 1049 return wndNameLength; 1050 1050 1051 1051 case WM_GETTEXT: //TODO: SS_ICON controls 1052 1053 1052 strncpy((LPSTR)lParam, windowNameA, wParam); 1053 return min(wndNameLength, wParam); 1054 1054 1055 1055 case WM_SETTEXT: 1056 1056 return 0; 1057 1057 1058 1058 case WM_SETREDRAW: 1059 1060 1061 elseSetWindowLongA (GWL_STYLE, GetWindowLongA (GWL_STYLE) & ~WS_VISIBLE);1062 1063 1059 if(wParam) 1060 SetWindowLongA (GWL_STYLE, GetWindowLongA (GWL_STYLE) | WS_VISIBLE); 1061 else SetWindowLongA (GWL_STYLE, GetWindowLongA (GWL_STYLE) & ~WS_VISIBLE); 1062 1063 return 0; //TODO 1064 1064 1065 1065 case WM_NCCREATE: 1066 1066 return(TRUE); 1067 1067 1068 1068 case WM_CTLCOLORMSGBOX: … … 1073 1073 case WM_CTLCOLORSTATIC: 1074 1074 case WM_CTLCOLORSCROLLBAR: 1075 1076 1077 1075 SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW)); 1076 SetTextColor((HDC)wParam, GetSysColor(COLOR_WINDOWTEXT)); 1077 return GetSysColorBrush(COLOR_BTNFACE); 1078 1078 1079 1079 case WM_PARENTNOTIFY: 1080 1080 return 0; 1081 1081 1082 1082 case WM_MOUSEACTIVATE: 1083 1083 { 1084 1085 1086 1087 1088 1089 1090 1091 if(rc)return rc;1092 1093 1094 1084 DWORD dwStyle = GetWindowLongA(GWL_STYLE); 1085 DWORD dwExStyle = GetWindowLongA(GWL_EXSTYLE); 1086 dprintf(("DefWndProc: WM_MOUSEACTIVATE for %x Msg %s", Win32Hwnd, GetMsgText(HIWORD(lParam)))); 1087 if(dwStyle & WS_CHILD && !(dwExStyle & WS_EX_NOPARENTNOTIFY) ) 1088 { 1089 if(getParent()) { 1090 LRESULT rc = getParent()->SendMessageA(WM_MOUSEACTIVATE, wParam, lParam ); 1091 if(rc) return rc; 1092 } 1093 } 1094 return (LOWORD(lParam) == HTCAPTION) ? MA_NOACTIVATE : MA_ACTIVATE; 1095 1095 } 1096 1096 case WM_SETCURSOR: 1097 1097 { 1098 1099 1100 1101 1102 1103 1104 1105 if(rc)return rc;1106 1107 1108 1098 DWORD dwStyle = GetWindowLongA(GWL_STYLE); 1099 DWORD dwExStyle = GetWindowLongA(GWL_EXSTYLE); 1100 dprintf(("DefWndProc: WM_SETCURSOR for %x Msg %s", Win32Hwnd, GetMsgText(HIWORD(lParam)))); 1101 if(dwStyle & WS_CHILD && !(dwExStyle & WS_EX_NOPARENTNOTIFY) ) 1102 { 1103 if(getParent()) { 1104 LRESULT rc = getParent()->SendMessageA(WM_SETCURSOR, wParam, lParam); 1105 if(rc) return rc; 1106 } 1107 } 1108 return 1; 1109 1109 } 1110 1110 case WM_MOUSEMOVE: 1111 1111 return 0; 1112 1112 1113 1113 case WM_WINDOWPOSCHANGED: … … 1115 1115 1116 1116 /* undocumented SWP flags - from SDK 3.1 */ 1117 #define SWP_NOCLIENTSIZE 1118 #define SWP_NOCLIENTMOVE 1119 1120 1121 WPARAM wp= SIZE_RESTORED;1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 SendMessageA(WM_SIZE, wp, MAKELONG(rectClient.right- rectClient.left,1132 1133 1134 1117 #define SWP_NOCLIENTSIZE 0x0800 1118 #define SWP_NOCLIENTMOVE 0x1000 1119 1120 PWINDOWPOS wpos = (PWINDOWPOS)lParam; 1121 WPARAM wp = SIZE_RESTORED; 1122 1123 if (!(wpos->flags & SWP_NOCLIENTMOVE)) 1124 SendMessageA(WM_MOVE, 0, MAKELONG(rectClient.left, rectClient.top)); 1125 1126 if (!(wpos->flags & SWP_NOCLIENTSIZE)) 1127 { 1128 if (dwStyle & WS_MAXIMIZE) wp = SIZE_MAXIMIZED; 1129 else if (dwStyle & WS_MINIMIZE) wp = SIZE_MINIMIZED; 1130 1131 SendMessageA(WM_SIZE, wp, MAKELONG(rectClient.right - rectClient.left, 1132 rectClient.bottom - rectClient.top)); 1133 } 1134 return 0; 1135 1135 } 1136 1136 case WM_ERASEBKGND: … … 1138 1138 { 1139 1139 RECT rect; 1140 1141 if (!windowClass->getBackgroundBrush()) return 0; 1142 1143 /* Since WM_ERASEBKGND may receive either a window dc or a */ 1144 /* client dc, the area to be erased has to be retrieved from */ 1145 /* the device context. */ 1146 GetClipBox( (HDC)wParam, &rect ); 1147 1148 FillRect( (HDC)wParam, &rect, windowClass->getBackgroundBrush()); 1149 1150 return 1; 1140 int rc; 1141 1142 if (!windowClass->getBackgroundBrush()) return 0; 1143 1144 /* Since WM_ERASEBKGND may receive either a window dc or a */ 1145 /* client dc, the area to be erased has to be retrieved from */ 1146 /* the device context. */ 1147 rc = GetClipBox( (HDC)wParam, &rect ); 1148 if ((rc == SIMPLEREGION) || (rc == COMPLEXREGION)) 1149 FillRect( (HDC)wParam, &rect, windowClass->getBackgroundBrush()); 1150 1151 return 1; 1151 1152 } 1152 1153 … … 1160 1161 case WM_NCMBUTTONUP: 1161 1162 case WM_NCMBUTTONDBLCLK: 1162 return 0;//TODO: Send WM_SYSCOMMAND if required1163 return 0; //TODO: Send WM_SYSCOMMAND if required 1163 1164 1164 1165 case WM_NCHITTEST: //TODO: Calculate position of 1165 1166 return HTCLIENT; 1166 1167 1167 1168 default: 1168 1169 return 1; 1169 1170 } 1170 1171 } … … 1176 1177 { 1177 1178 case WM_GETTEXTLENGTH: 1178 1179 return wndNameLength; 1179 1180 1180 1181 case WM_GETTEXT: //TODO: SS_ICON controls 1181 1182 1182 lstrcpynW((LPWSTR)lParam, windowNameW, wParam); 1183 return min(wndNameLength, wParam); 1183 1184 1184 1185 default: 1185 1186 return DefWindowProcA(Msg, wParam, lParam); 1186 1187 } 1187 1188 } … … 1191 1192 { 1192 1193 if(PostSpyMessage(getWindowHandle(), Msg, wParam, lParam) == FALSE) 1193 1194 dprintf(("SendMessageA %s for %x %x %x", GetMsgText(Msg), getWindowHandle(), wParam, lParam)); 1194 1195 1195 1196 if(HkCBT::OS2HkCBTProc(getWindowHandle(), Msg, wParam, lParam) == TRUE) {//hook swallowed msg 1196 1197 return(0); 1197 1198 } 1198 1199 switch(Msg) 1199 1200 { 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1201 case WM_CREATE: 1202 { 1203 if(win32wndproc(getWindowHandle(), WM_NCCREATE, 0, lParam) == 0) { 1204 dprintf(("WM_NCCREATE returned FALSE\n")); 1205 return(-1); //don't create window 1206 } 1207 if(win32wndproc(getWindowHandle(), WM_CREATE, 0, lParam) == -1) { 1208 dprintf(("WM_CREATE returned -1\n")); 1209 return(-1); //don't create window 1210 } 1211 NotifyParent(Msg, wParam, lParam); 1212 1213 return(0); 1214 } 1215 case WM_SETTEXT: //TODO: Nothing happens if passed to DefWindowProc 1216 return win32wndproc(getWindowHandle(), WM_SETTEXT, wParam, lParam); 1217 1218 case WM_LBUTTONDOWN: 1219 case WM_MBUTTONDOWN: 1220 case WM_RBUTTONDOWN: 1221 NotifyParent(Msg, wParam, lParam); 1222 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1223 1224 case WM_DESTROY: 1225 win32wndproc(getWindowHandle(), WM_NCDESTROY, 0, 0); 1226 NotifyParent(Msg, wParam, lParam); 1227 return win32wndproc(getWindowHandle(), WM_DESTROY, 0, 0); 1228 default: 1229 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1229 1230 } 1230 1231 } … … 1234 1235 { 1235 1236 if(PostSpyMessage(getWindowHandle(), Msg, wParam, lParam) == FALSE) 1236 1237 dprintf(("SendMessageA %s for %x %x %x", GetMsgText(Msg), getWindowHandle(), wParam, lParam)); 1237 1238 1238 1239 if(HkCBT::OS2HkCBTProc(getWindowHandle(), Msg, wParam, lParam) == TRUE) {//hook swallowed msg 1239 1240 return(0); 1240 1241 } 1241 1242 switch(Msg) 1242 1243 { 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1244 case WM_CREATE: 1245 { 1246 if(win32wndproc(getWindowHandle(), WM_NCCREATE, 0, lParam) == 0) { 1247 dprintf(("WM_NCCREATE returned FALSE\n")); 1248 return(0); //don't create window 1249 } 1250 if(win32wndproc(getWindowHandle(), WM_CREATE, 0, lParam) == 0) { 1251 dprintf(("WM_CREATE returned FALSE\n")); 1252 return(0); //don't create window 1253 } 1254 NotifyParent(Msg, wParam, lParam); 1255 1256 return(1); 1257 } 1258 case WM_SETTEXT: //TODO: Nothing happens if passed to DefWindowProc 1259 return win32wndproc(getWindowHandle(), WM_SETTEXT, wParam, lParam); 1260 1261 case WM_LBUTTONDOWN: 1262 case WM_MBUTTONDOWN: 1263 case WM_RBUTTONDOWN: 1264 NotifyParent(Msg, wParam, lParam); 1265 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1266 1267 case WM_DESTROY: 1268 win32wndproc(getWindowHandle(), WM_NCDESTROY, 0, 0); 1269 NotifyParent(Msg, wParam, lParam); 1270 return win32wndproc(getWindowHandle(), WM_DESTROY, 0, 0); 1271 1272 default: 1273 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1273 1274 } 1274 1275 } … … 1279 1280 { 1280 1281 if(PostSpyMessage(getWindowHandle(), Msg, wParam, lParam) == FALSE) 1281 1282 dprintf(("SendInternalMessageA %s for %x %x %x", GetMsgText(Msg), getWindowHandle(), wParam, lParam)); 1282 1283 1283 1284 if(HkCBT::OS2HkCBTProc(getWindowHandle(), Msg, wParam, lParam) == TRUE) {//hook swallowed msg 1284 1285 return(0); 1285 1286 } 1286 1287 switch(Msg) 1287 1288 { 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1289 case WM_CREATE: 1290 { 1291 if(win32wndproc(getWindowHandle(), WM_NCCREATE, 0, lParam) == 0) { 1292 dprintf(("WM_NCCREATE returned FALSE\n")); 1293 return(0); //don't create window 1294 } 1295 if(win32wndproc(getWindowHandle(), WM_CREATE, 0, lParam) == 0) { 1296 dprintf(("WM_CREATE returned FALSE\n")); 1297 return(0); //don't create window 1298 } 1299 NotifyParent(Msg, wParam, lParam); 1300 1301 return(1); 1302 } 1303 case WM_LBUTTONDOWN: 1304 case WM_MBUTTONDOWN: 1305 case WM_RBUTTONDOWN: 1306 NotifyParent(Msg, wParam, lParam); 1307 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1308 1309 case WM_DESTROY: 1310 win32wndproc(getWindowHandle(), WM_NCDESTROY, 0, 0); 1311 NotifyParent(Msg, wParam, lParam); 1312 return win32wndproc(getWindowHandle(), WM_DESTROY, 0, 0); 1313 default: 1314 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1314 1315 } 1315 1316 } … … 1321 1322 { 1322 1323 if(PostSpyMessage(getWindowHandle(), Msg, wParam, lParam) == FALSE) 1323 1324 dprintf(("SendInternalMessageW %s for %x %x %x", GetMsgText(Msg), getWindowHandle(), wParam, lParam)); 1324 1325 1325 1326 if(HkCBT::OS2HkCBTProc(getWindowHandle(), Msg, wParam, lParam) == TRUE) {//hook swallowed msg 1326 1327 return(0); 1327 1328 } 1328 1329 switch(Msg) 1329 1330 { 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1331 case WM_CREATE: 1332 { 1333 if(win32wndproc(getWindowHandle(), WM_NCCREATE, 0, lParam) == 0) { 1334 dprintf(("WM_NCCREATE returned FALSE\n")); 1335 return(0); //don't create window 1336 } 1337 if(win32wndproc(getWindowHandle(), WM_CREATE, 0, lParam) == 0) { 1338 dprintf(("WM_CREATE returned FALSE\n")); 1339 return(0); //don't create window 1340 } 1341 NotifyParent(Msg, wParam, lParam); 1342 1343 return(1); 1344 } 1345 case WM_LBUTTONDOWN: 1346 case WM_MBUTTONDOWN: 1347 case WM_RBUTTONDOWN: 1348 NotifyParent(Msg, wParam, lParam); 1349 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1350 1351 case WM_DESTROY: 1352 win32wndproc(getWindowHandle(), WM_NCDESTROY, 0, 0); 1353 NotifyParent(Msg, wParam, lParam); 1354 return win32wndproc(getWindowHandle(), WM_DESTROY, 0, 0); 1355 default: 1356 return win32wndproc(getWindowHandle(), Msg, wParam, lParam); 1356 1357 } 1357 1358 } … … 1378 1379 while(window) 1379 1380 { 1380 1381 1382 1383 1384 1385 1386 1387 1388 elseparentwindow->SendInternalMessageA(WM_PARENTNOTIFY, MAKEWPARAM(Msg, window->getWindowId()), lParam );1389 1390 1391 elsebreak;1392 1393 1381 if(window->getStyle() & WS_CHILD && !(window->getExStyle() & WS_EX_NOPARENTNOTIFY) ) 1382 { 1383 /* Notify the parent window only */ 1384 parentwindow = window->getParent(); 1385 if(parentwindow) { 1386 if(Msg == WM_CREATE || Msg == WM_DESTROY) { 1387 parentwindow->SendInternalMessageA(WM_PARENTNOTIFY, MAKEWPARAM(Msg, window->getWindowId()), (LPARAM)window->getWindowHandle()); 1388 } 1389 else parentwindow->SendInternalMessageA(WM_PARENTNOTIFY, MAKEWPARAM(Msg, window->getWindowId()), lParam ); 1390 } 1391 } 1392 else break; 1393 1394 window = parentwindow; 1394 1395 } 1395 1396 } … … 1398 1399 BOOL Win32BaseWindow::SetMenu(HMENU hMenu) 1399 1400 { 1400 PVOID 1401 PVOID menutemplate; 1401 1402 Win32Resource *winres = (Win32Resource *)hMenu; 1402 1403 1403 1404 dprintf(("SetMenu %x", hMenu)); 1404 1405 if(HIWORD(winres) == 0) { 1405 1406 1407 1406 dprintf(("Win32BaseWindow:: Win32Resource *winres == 0")); 1407 SetLastError(ERROR_INVALID_PARAMETER); 1408 return FALSE; 1408 1409 } 1409 1410 menutemplate = winres->lockOS2Resource(); 1410 1411 if(menutemplate == NULL) 1411 1412 { 1412 1413 1413 dprintf(("Win32BaseWindow::SetMenu menutemplate == 0")); 1414 return FALSE; 1414 1415 } 1415 1416 OS2HwndMenu = OSLibWinCreateMenu(OS2HwndFrame, menutemplate); 1416 1417 if(OS2HwndMenu == 0) { 1417 1418 1418 dprintf(("Win32BaseWindow::SetMenu OS2HwndMenu == 0")); 1419 return FALSE; 1419 1420 } 1420 1421 menuResource = winres; … … 1426 1427 { 1427 1428 Win32Resource *winres = (Win32Resource *)hAccel; 1428 HANDLE 1429 HANDLE accelhandle; 1429 1430 1430 1431 if(HIWORD(hAccel) == 0) { 1431 1432 1433 1432 dprintf(("SetAccelTable: hAccel %x invalid", hAccel)); 1433 SetLastError(ERROR_INVALID_PARAMETER); 1434 return FALSE; 1434 1435 } 1435 1436 acceltableResource = winres; … … 1453 1454 dprintf(("ShowWindow %x", nCmdShow)); 1454 1455 if(fFirstShow) { 1455 1456 1457 1458 1459 1460 1461 1462 1456 if(isFrameWindow() && IS_OVERLAPPED(getStyle())) { 1457 SendMessageA(WM_SIZE, SIZE_RESTORED, 1458 MAKELONG(rectClient.right-rectClient.left, 1459 rectClient.bottom-rectClient.top)); 1460 SendMessageA(WM_MOVE, 0, MAKELONG( rectClient.left, rectClient.top ) ); 1461 1462 } 1463 fFirstShow = FALSE; 1463 1464 } 1464 1465 switch(nCmdShow) … … 1466 1467 case SW_SHOW: 1467 1468 case SW_SHOWDEFAULT: //todo 1468 1469 1469 showstate = SWPOS_SHOW | SWPOS_ACTIVATE; 1470 break; 1470 1471 case SW_HIDE: 1471 1472 1472 showstate = SWPOS_HIDE; 1473 break; 1473 1474 case SW_RESTORE: 1474 1475 1475 showstate = SWPOS_RESTORE | SWPOS_SHOW | SWPOS_ACTIVATE; 1476 break; 1476 1477 case SW_MINIMIZE: 1477 1478 1478 showstate = SWPOS_MINIMIZE; 1479 break; 1479 1480 case SW_SHOWMAXIMIZED: 1480 1481 1481 showstate = SWPOS_MAXIMIZE | SWPOS_SHOW | SWPOS_ACTIVATE; 1482 break; 1482 1483 case SW_SHOWMINIMIZED: 1483 1484 1484 showstate = SWPOS_MINIMIZE | SWPOS_SHOW | SWPOS_ACTIVATE; 1485 break; 1485 1486 case SW_SHOWMINNOACTIVE: 1486 1487 1487 showstate = SWPOS_MINIMIZE | SWPOS_SHOW; 1488 break; 1488 1489 case SW_SHOWNA: 1489 1490 1490 showstate = SWPOS_SHOW; 1491 break; 1491 1492 case SW_SHOWNOACTIVATE: 1492 1493 1493 showstate = SWPOS_SHOW; 1494 break; 1494 1495 case SW_SHOWNORMAL: 1495 1496 1496 showstate = SWPOS_RESTORE | SWPOS_ACTIVATE | SWPOS_SHOW; 1497 break; 1497 1498 } 1498 1499 return OSLibWinShowWindow(OS2HwndFrame, showstate); … … 1508 1509 dprintf (("SetWindowPos %x %x (%d,%d)(%d,%d) %x", Win32Hwnd, hwndInsertAfter, x, y, cx, cy, fuFlags)); 1509 1510 1510 /* Validate the flags passed in ... 1511 /* Validate the flags passed in ... */ 1511 1512 if ( fuFlags & 1512 ~(SWP_NOSIZE | SWP_NOMOVE| SWP_NOZORDER |1513 SWP_NOREDRAW| SWP_NOACTIVATE | SWP_FRAMECHANGED |1514 1515 1513 ~(SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | 1514 SWP_NOREDRAW | SWP_NOACTIVATE | SWP_FRAMECHANGED | 1515 SWP_SHOWWINDOW | SWP_HIDEWINDOW | SWP_NOCOPYBITS | 1516 SWP_NOOWNERZORDER) ) 1516 1517 { 1517 1518 return FALSE; … … 1524 1525 // Set up with Windows values. 1525 1526 //**************************** 1526 wpos.flags 1527 wpos.cy 1528 wpos.cx 1529 wpos.x 1530 wpos.y 1527 wpos.flags = fuFlags; 1528 wpos.cy = cy; 1529 wpos.cx = cx; 1530 wpos.x = x; 1531 wpos.y = y; 1531 1532 wpos.hwndInsertAfter = hwndInsertAfter; 1532 wpos.hwnd 1533 wpos.hwnd = getWindowHandle(); 1533 1534 1534 1535 //********************************************** … … 1538 1539 if (isChild()) 1539 1540 { 1540 1541 1541 hParent = getParent()->getOS2WindowHandle(); 1542 OSLibWinQueryWindowPos(OS2Hwnd, &swpOld); 1542 1543 } else 1543 1544 OSLibWinQueryWindowPos(OS2HwndFrame, &swpOld); 1544 1545 } 1545 1546 OSLibMapWINDOWPOStoSWP(&wpos, &swp, &swpOld, hParent, OS2HwndFrame); … … 1586 1587 if (rc == FALSE) 1587 1588 { 1588 // 1589 // SET_ERROR_LAST(); 1589 1590 } 1590 1591 else … … 1598 1599 ** a WM_UPDATEFRAME, which will provide the behavior of WM_NCCALCSIZE. 1599 1600 */ 1600 // 1601 // 1601 // if (fuFlags & SWP_FRAMECHANGED_W) 1602 // WinSendMsg(hWindow, WM_UPDATEFRAME, (MPARAM)-1, 0); 1602 1603 } 1603 1604 … … 1618 1619 return getParent()->getWindowHandle(); 1619 1620 } 1620 else 1621 else return 0; 1621 1622 } 1622 1623 //****************************************************************************** … … 1628 1629 1629 1630 if(getParent()) { 1630 1631 oldhwnd = getParent()->getWindowHandle(); 1631 1632 } 1632 1633 else oldhwnd = 0; … … 1634 1635 if(hwndNewParent == 0) {//desktop window = parent 1635 1636 setParent(NULL); 1636 1637 1637 OSLibWinSetParent(getOS2WindowHandle(), OSLIB_HWND_DESKTOP); 1638 return oldhwnd; 1638 1639 } 1639 1640 newparent = GetWindowFromHandle(hwndNewParent); 1640 1641 if(newparent) 1641 1642 { 1642 1643 1644 1643 setParent(newparent); 1644 OSLibWinSetParent(getOS2WindowHandle(), getParent()->getOS2WindowHandle()); 1645 return oldhwnd; 1645 1646 } 1646 1647 SetLastError(ERROR_INVALID_PARAMETER); … … 1654 1655 return getParent()->getWindowHandle() == hwndParent; 1655 1656 } 1656 else 1657 else return 0; 1657 1658 } 1658 1659 //****************************************************************************** … … 1673 1674 if(OSLibWinQueryUpdateRect(OS2Hwnd, &rect)) 1674 1675 {//update region not empty 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1676 HDC hdc; 1677 1678 hdc = O32_GetDC(OS2Hwnd); 1679 if (isIcon) 1680 { 1681 SendInternalMessageA(WM_ICONERASEBKGND, (WPARAM)hdc, 0); 1682 SendInternalMessageA(WM_PAINTICON, 0, 0); 1683 } else 1684 { 1685 SendInternalMessageA(WM_ERASEBKGND, (WPARAM)hdc, 0); 1686 SendInternalMessageA(WM_PAINT, 0, 0); 1687 } 1688 O32_ReleaseDC(OS2Hwnd, hdc); 1688 1689 } 1689 1690 return TRUE; … … 1701 1702 //****************************************************************************** 1702 1703 HWND Win32BaseWindow::FindWindowEx(HWND hwndParent, HWND hwndChildAfter, LPSTR lpszClass, LPSTR lpszWindow, 1703 1704 BOOL fUnicode) 1704 1705 { 1705 1706 Win32BaseWindow *parent = GetWindowFromHandle(hwndParent); … … 1710 1711 (hwndParent == OSLIB_HWND_DESKTOP && hwndChildAfter != 0)) 1711 1712 { 1712 1713 1714 1713 dprintf(("Win32BaseWindow::FindWindowEx: parent or child not found %x %x", hwndParent, hwndChildAfter)); 1714 SetLastError(ERROR_INVALID_WINDOW_HANDLE); 1715 return 0; 1715 1716 } 1716 1717 if(hwndParent != OSLIB_HWND_DESKTOP) 1717 1718 {//if the current process owns the window, just do a quick search 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1719 child = (Win32BaseWindow *)parent->GetFirstChild(); 1720 if(hwndChildAfter != 0) 1721 { 1722 while(child) 1723 { 1724 if(child->getWindowHandle() == hwndChildAfter) 1725 { 1726 child = (Win32BaseWindow *)child->GetNextChild(); 1727 break; 1728 } 1729 child = (Win32BaseWindow *)child->GetNextChild(); 1730 } 1731 } 1732 while(child) 1733 { 1734 if(child->getWindowClass()->hasClassName(lpszClass, fUnicode) && 1735 (!lpszWindow || child->hasWindowName(lpszWindow, fUnicode))) 1736 { 1737 dprintf(("FindWindowEx: Found window %x", child->getWindowHandle())); 1738 return child->getWindowHandle(); 1739 } 1740 child = (Win32BaseWindow *)child->GetNextChild(); 1741 } 1741 1742 } 1742 1743 else { 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1744 Win32BaseWindow *wnd; 1745 HWND henum, hwnd; 1746 1747 henum = OSLibWinBeginEnumWindows(OSLIB_HWND_DESKTOP); 1748 hwnd = OSLibWinGetNextWindow(henum); 1749 1750 while(hwnd) 1751 { 1752 wnd = GetWindowFromOS2Handle(hwnd); 1753 if(wnd == NULL) { 1754 hwnd = OSLibWinQueryClientWindow(hwnd); 1755 if(hwnd) wnd = GetWindowFromOS2Handle(hwnd); 1756 } 1757 1758 if(wnd) { 1759 LPVOID sharedmembase = (LPVOID)OSLibWinGetWindowULong(hwnd, OFFSET_WIN32PM_SHAREDMEM); 1760 1761 if(OSLibDosGetSharedMem(sharedmembase, MAX_HEAPSIZE, OSLIB_PAG_READ) != 0) { 1762 dprintf(("OSLibDosGetSharedMem returned error for %x", wnd)); 1763 break; 1764 } 1765 if(wnd->getWindowClass()->hasClassName(lpszClass, fUnicode) && 1766 (!lpszWindow || wnd->hasWindowName(lpszWindow, fUnicode))) 1767 { 1768 OSLibWinEndEnumWindows(henum); 1769 dprintf(("FindWindowEx: Found window %x", wnd->getWindowHandle())); 1770 return wnd->getWindowHandle(); 1771 } 1772 } 1773 hwnd = OSLibWinGetNextWindow(henum); 1774 } 1775 OSLibWinEndEnumWindows(henum); 1775 1776 } 1776 1777 SetLastError(ERROR_CANNOT_FIND_WND_CLASS); //TODO: not always correct … … 1783 1784 { 1784 1785 Win32BaseWindow *win32wnd; 1785 ULONG 1786 ULONG 1787 HWND 1786 ULONG magic; 1787 ULONG getcmd = 0; 1788 HWND hwndRelated; 1788 1789 1789 1790 dprintf(("GetWindow %x %d NOT COMPLETE", getWindowHandle(), uCmd)); 1790 1791 switch(uCmd) 1791 1792 { 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1793 case GW_CHILD: 1794 getcmd = QWOS_TOP; 1795 break; 1796 case GW_HWNDFIRST: 1797 if(getParent()) { 1798 getcmd = QWOS_TOP; //top of child windows 1799 } 1800 else getcmd = QWOS_TOP; //TODO 1801 break; 1802 case GW_HWNDLAST: 1803 if(getParent()) { 1804 getcmd = QWOS_BOTTOM; //bottom of child windows 1805 } 1806 else getcmd = QWOS_BOTTOM; //TODO 1807 break; 1808 case GW_HWNDNEXT: 1809 getcmd = QWOS_NEXT; 1810 break; 1811 case GW_HWNDPREV: 1812 getcmd = QWOS_PREV; 1813 break; 1814 case GW_OWNER: 1815 if(owner) { 1816 return owner->getWindowHandle(); 1817 } 1818 else return 0; 1818 1819 } 1819 1820 hwndRelated = OSLibWinQueryWindow(OS2Hwnd, getcmd); 1820 1821 if(hwndRelated) 1821 1822 { 1822 1823 magic= OSLibWinGetWindowULong(hwndRelated, OFFSET_WIN32PM_MAGIC);1824 1825 1826 1827 1823 win32wnd = (Win32BaseWindow *)OSLibWinGetWindowULong(hwndRelated, OFFSET_WIN32WNDPTR); 1824 magic = OSLibWinGetWindowULong(hwndRelated, OFFSET_WIN32PM_MAGIC); 1825 if(CheckMagicDword(magic) && win32wnd) 1826 { 1827 return win32wnd->getWindowHandle(); 1828 } 1828 1829 } 1829 1830 return 0; … … 1852 1853 HWND Win32BaseWindow::GetActiveWindow() 1853 1854 { 1854 HWND 1855 HWND hwndActive; 1855 1856 Win32BaseWindow *win32wnd; 1856 ULONG 1857 ULONG magic; 1857 1858 1858 1859 hwndActive = OSLibWinQueryActiveWindow(); … … 1862 1863 if(CheckMagicDword(magic) && win32wnd) 1863 1864 { 1864 1865 return win32wnd->getWindowHandle(); 1865 1866 } 1866 1867 return hwndActive; … … 1895 1896 { 1896 1897 if(fUnicode) { 1897 1898 return (lstrcmpW(windowNameW, (LPWSTR)wndname) == 0); 1898 1899 } 1899 1900 else return (strcmp(windowNameA, wndname) == 0); … … 1916 1917 { 1917 1918 if(lpsz == NULL) 1918 1919 return FALSE; 1919 1920 1920 1921 if(isUnicode == FALSE) { 1921 1922 1923 1924 1922 windowNameA = (LPSTR)_smalloc(strlen(lpsz)+1); 1923 strcpy(windowNameA, lpsz); 1924 windowNameW = (LPWSTR)_smalloc((strlen(lpsz)+1)*sizeof(WCHAR)); 1925 lstrcpyAtoW(windowNameW, windowNameA); 1925 1926 } 1926 1927 else { 1927 1928 1929 1930 1928 windowNameW = (LPWSTR)_smalloc((lstrlenW((LPWSTR)lpsz)+1)*sizeof(WCHAR)); 1929 lstrcpyW(windowNameW, (LPWSTR)lpsz); 1930 windowNameA = (LPSTR)_smalloc(lstrlenW((LPWSTR)lpsz)+1); 1931 lstrcpyWtoA(windowNameA, windowNameW); 1931 1932 } 1932 1933 wndNameLength = strlen(windowNameA)+1; //including 0 terminator 1933 1934 1934 1935 if(OS2Hwnd) 1935 1936 return OSLibWinSetWindowText(OS2Hwnd, (LPSTR)windowNameA); 1936 1937 1937 1938 return TRUE; … … 1944 1945 1945 1946 switch(index) { 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1947 case GWL_EXSTYLE: 1948 oldval = dwExStyle; 1949 dwExStyle = value; 1950 return oldval; 1951 case GWL_STYLE: 1952 oldval = dwStyle; 1953 dwStyle = value; 1954 return oldval; 1955 case GWL_WNDPROC: 1956 oldval = (LONG)getWindowProc(); 1957 setWindowProc((WNDPROC)value); 1958 return oldval; 1959 case GWL_HINSTANCE: 1960 oldval = hInstance; 1961 hInstance = value; 1962 return oldval; 1963 case GWL_HWNDPARENT: 1964 return SetParent((HWND)value); 1965 1966 case GWL_ID: 1967 oldval = getWindowId(); 1968 setWindowId(value); 1969 return oldval; 1970 case GWL_USERDATA: 1971 oldval = userData; 1972 userData = value; 1973 return oldval; 1974 default: 1975 if(index >= 0 && index/4 < nrUserWindowLong) 1976 { 1977 oldval = userWindowLong[index/4]; 1978 userWindowLong[index/4] = value; 1979 return oldval; 1980 } 1981 SetLastError(ERROR_INVALID_PARAMETER); 1982 return 0; 1982 1983 } 1983 1984 } … … 1987 1988 { 1988 1989 switch(index) { 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 elsereturn 0;2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 1990 case GWL_EXSTYLE: 1991 return dwExStyle; 1992 case GWL_STYLE: 1993 return dwStyle; 1994 case GWL_WNDPROC: 1995 return (ULONG)getWindowProc(); 1996 case GWL_HINSTANCE: 1997 return hInstance; 1998 case GWL_HWNDPARENT: 1999 if(getParent()) { 2000 return getParent()->getWindowHandle(); 2001 } 2002 else return 0; 2003 case GWL_ID: 2004 return getWindowId(); 2005 case GWL_USERDATA: 2006 return userData; 2007 default: 2008 if(index >= 0 && index/4 < nrUserWindowLong) 2009 { 2010 return userWindowLong[index/4]; 2011 } 2012 SetLastError(ERROR_INVALID_PARAMETER); 2013 return 0; 2013 2014 } 2014 2015 } … … 2021 2022 if(index >= 0 && index/4 < nrUserWindowLong) 2022 2023 { 2023 2024 2025 2024 oldval = ((WORD *)userWindowLong)[index/2]; 2025 ((WORD *)userWindowLong)[index/2] = value; 2026 return oldval; 2026 2027 } 2027 2028 SetLastError(ERROR_INVALID_PARAMETER); … … 2034 2035 if(index >= 0 && index/4 < nrUserWindowLong) 2035 2036 { 2036 2037 return ((WORD *)userWindowLong)[index/2]; 2037 2038 } 2038 2039 SetLastError(ERROR_INVALID_PARAMETER); … … 2046 2047 2047 2048 if(HwGetWindowHandleData(hwnd, (DWORD *)&window) == TRUE) { 2048 2049 return window; 2049 2050 } 2050 2051 else return NULL; … … 2055 2056 { 2056 2057 Win32BaseWindow *win32wnd; 2057 DWORD 2058 DWORD magic; 2058 2059 2059 2060 win32wnd = (Win32BaseWindow *)OSLibWinGetWindowULong(hwnd, OFFSET_WIN32WNDPTR); … … 2061 2062 2062 2063 if(win32wnd && CheckMagicDword(magic)) { 2063 2064 return win32wnd; 2064 2065 } 2065 2066 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.