Ignore:
Timestamp:
Oct 29, 2001, 2:37:01 PM (24 years ago)
Author:
sandervl
Message:

updates for sending WM_DEVICECHANGE on CD status change

File:
1 edited

Legend:

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

    r7216 r7263  
    1 /* $Id: pmwindow.cpp,v 1.160 2001-10-26 12:46:16 phaller Exp $ */
     1/* $Id: pmwindow.cpp,v 1.161 2001-10-29 13:37:01 sandervl Exp $ */
    22/*
    33 * Win32 Window Managment Code for OS/2
     
    1616#define INCL_DOSPROCESS
    1717#define INCL_DOSMODULEMGR
     18#define INCL_DOSDEVICES
     19#define INCL_DOSDEVIOCTL
    1820#define INCL_WINTRACKRECT
    1921
     
    4850#include <pmscan.h>
    4951#include <winscan.h>
     52#include <win\dbt.h>
    5053
    5154#define DBG_LOCALLOG    DBG_pmwindow
     
    6669static PFNWP pfnFrameWndProc = NULL;
    6770static HWND  hwndFocusChange = 0;
     71static HWND  hwndCD = 0;
    6872
    6973// Note:
     
    7680
    7781MRESULT EXPENTRY Win32WindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
     82MRESULT EXPENTRY Win32CDWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
    7883MRESULT EXPENTRY Win32FrameWindowProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
    7984void FrameReplaceMenuItem(HWND hwndMenu, ULONG nIndex, ULONG idOld, ULONG   idNew,
     
    126131    dprintf(("InitPM: WinSetCP was %sOK", rc ? "" : "not "));
    127132
     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
    128146    if(!WinRegisterClass(                 /* Register window class        */
    129147        hab,                               /* Anchor block handle          */
     
    226244    fOS2Look = fLooks;
    227245    MENU_Init();
     246}
     247//******************************************************************************
     248//CD notification window class
     249//******************************************************************************
     250MRESULT 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;
    228378}
    229379//******************************************************************************
     
    316466            break;
    317467        }
     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
    318476    createfail:
    319477        rc = (MRESULT)FALSE;
Note: See TracChangeset for help on using the changeset viewer.