Changeset 7263 for trunk/src/user32/pmwindow.cpp
- Timestamp:
- Oct 29, 2001, 2:37:01 PM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/user32/pmwindow.cpp
r7216 r7263 1 /* $Id: pmwindow.cpp,v 1.16 0 2001-10-26 12:46:16 phallerExp $ */1 /* $Id: pmwindow.cpp,v 1.161 2001-10-29 13:37:01 sandervl Exp $ */ 2 2 /* 3 3 * Win32 Window Managment Code for OS/2 … … 16 16 #define INCL_DOSPROCESS 17 17 #define INCL_DOSMODULEMGR 18 #define INCL_DOSDEVICES 19 #define INCL_DOSDEVIOCTL 18 20 #define INCL_WINTRACKRECT 19 21 … … 48 50 #include <pmscan.h> 49 51 #include <winscan.h> 52 #include <win\dbt.h> 50 53 51 54 #define DBG_LOCALLOG DBG_pmwindow … … 66 69 static PFNWP pfnFrameWndProc = NULL; 67 70 static HWND hwndFocusChange = 0; 71 static HWND hwndCD = 0; 68 72 69 73 // Note: … … 76 80 77 81 MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2); 82 MRESULT EXPENTRY Win32CDWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2); 78 83 MRESULT EXPENTRY Win32FrameWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2); 79 84 void FrameReplaceMenuItem(HWND hwndMenu, ULONG nIndex, ULONG idOld, ULONG idNew, … … 126 131 dprintf(("InitPM: WinSetCP was %sOK", rc ? "" : "not ")); 127 132 133 //CD polling window class 134 if(!WinRegisterClass( /* Register window class */ 135 hab, /* Anchor block handle */ 136 (PSZ)WIN32_CDCLASS, /* Window class name */ 137 (PFNWP)Win32CDWindowProc, /* Address of window procedure */ 138 0, 139 0)) 140 { 141 dprintf(("WinRegisterClass Win32BaseWindow failed")); 142 return(FALSE); 143 } 144 145 //Standard Odin window class 128 146 if(!WinRegisterClass( /* Register window class */ 129 147 hab, /* Anchor block handle */ … … 226 244 fOS2Look = fLooks; 227 245 MENU_Init(); 246 } 247 //****************************************************************************** 248 //CD notification window class 249 //****************************************************************************** 250 MRESULT EXPENTRY Win32CDWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2) 251 { 252 #pragma pack(1) 253 typedef struct 254 { 255 BYTE ucCommandInfo; 256 WORD usDriveUnit; 257 } ParameterBlock; 258 #pragma pack() 259 260 MRESULT rc = 0; 261 static ULONG drives[26] = {0}; 262 static int drivestatus[26] = {0}; 263 264 switch( msg ) 265 { 266 //OS/2 msgs 267 case WM_CREATE: 268 { 269 char drive[2]; 270 271 //skip floppy drives 272 drive[0] = 'C'; 273 drive[1] = 0; 274 275 for(int i=2;i<26;i++) { 276 drives[i] = GetDriveTypeA(drive); 277 if(drives[i] == DRIVE_CDROM_W) 278 { 279 DWORD parsize = sizeof(ParameterBlock); 280 DWORD datasize = 2; 281 WORD status = 0; 282 DWORD rc; 283 ParameterBlock parm; 284 285 parm.ucCommandInfo = 0; 286 parm.usDriveUnit = i; 287 rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_GETLOCKSTATUS, &parm, sizeof(parm), &parsize, 288 &status, sizeof(status), &datasize); 289 if(rc != NO_ERROR) { 290 dprintf(("DosDevIOCtl failed with rc %d", rc)); 291 drives[i] = 0; 292 continue; 293 } 294 //if no disk present, return FALSE 295 if(status & 4) { 296 drivestatus[i] = status & 4; 297 } 298 } 299 drive[0]++; 300 } 301 WinStartTimer(hab, hwnd, 17, 32*3); 302 //// WinStartTimer(hab, hwnd, 17, 5000); 303 rc = (MRESULT)FALSE; 304 break; 305 } 306 case WM_TIMER: 307 { 308 for(int i=0;i<26;i++) 309 { 310 //for now only cdrom/dvd drives 311 if(drives[i] == DRIVE_CDROM_W) 312 { 313 DWORD parsize = sizeof(ParameterBlock); 314 DWORD datasize = 2; 315 WORD status = 0; 316 DWORD rc; 317 ParameterBlock parm; 318 319 parm.ucCommandInfo = 0; 320 parm.usDriveUnit = i; 321 rc = DosDevIOCtl(-1, IOCTL_DISK, DSK_GETLOCKSTATUS, &parm, sizeof(parm), &parsize, 322 &status, sizeof(status), &datasize); 323 if(rc != NO_ERROR) { 324 dprintf(("DosDevIOCtl failed with rc %d", rc)); 325 return FALSE; 326 } 327 dprintf(("Disk status 0x%x", status)); 328 //Send WM_DEVICECHANGE message when CD status changes 329 if((status & 4) != drivestatus[i]) 330 { 331 PID pidThis, pidTemp; 332 HENUM henum; 333 HWND hwndEnum; 334 DEV_BROADCAST_VOLUME volchange; 335 336 volchange.dbcv_size = sizeof(volchange); 337 volchange.dbcv_devicetype = DBT_DEVTYP_VOLUME; 338 volchange.dbcv_reserved = 0; 339 volchange.dbcv_unitmask = (1 << i); 340 volchange.dbcv_flags = DBTF_MEDIA; 341 342 WinQueryWindowProcess(hwnd, &pidThis, NULL); 343 344 //Iterate over all child windows of the desktop 345 henum = WinBeginEnumWindows(HWND_DESKTOP); 346 347 while(hwndEnum = WinGetNextWindow(henum)) 348 { 349 WinQueryWindowProcess(hwndEnum, &pidTemp, NULL); 350 if(pidTemp == pidThis) 351 { 352 HWND hwndWin32 = OS2ToWin32Handle(hwndEnum); 353 if(hwndWin32) { 354 SendMessageA(hwndWin32, 355 WM_DEVICECHANGE_W, 356 (status & 4) ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE, 357 (LPARAM)&volchange); 358 } 359 } 360 } 361 WinEndEnumWindows(henum); 362 363 drivestatus[i] = (status & 4); 364 } 365 } 366 } 367 break; 368 } 369 370 case WM_DESTROY: 371 WinStopTimer(hab, hwnd, 17); 372 break; 373 374 default: 375 return WinDefWindowProc( hwnd, msg, mp1, mp2 ); 376 } 377 return (MRESULT)rc; 228 378 } 229 379 //****************************************************************************** … … 316 466 break; 317 467 } 468 469 //Create CD notification window 470 if(hwndCD == 0) { 471 hwndCD = WinCreateWindow(HWND_DESKTOP, WIN32_CDCLASS, 472 NULL, 0, 0, 0, 0, 0, 473 HWND_DESKTOP, HWND_TOP, 0, NULL, NULL); 474 } 475 318 476 createfail: 319 477 rc = (MRESULT)FALSE;
Note:
See TracChangeset
for help on using the changeset viewer.