Annotation of quake2/win32/glw_imp.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ** GLW_IMP.C
                      3: **
                      4: ** This file contains ALL Win32 specific stuff having to do with the
                      5: ** OpenGL refresh.  When a port is being made the following functions
                      6: ** must be implemented by the port:
                      7: **
                      8: ** GLimp_EndFrame
                      9: ** GLimp_Init
                     10: ** GLimp_Shutdown
                     11: ** GLimp_SwitchFullscreen
                     12: **
                     13: */
                     14: #include <assert.h>
                     15: #include <windows.h>
                     16: #include "../ref_gl/gl_local.h"
                     17: #include "glw_win.h"
                     18: #include "winquake.h"
                     19: 
                     20: static qboolean GLimp_SwitchFullscreen( int width, int height );
                     21: qboolean GLimp_InitGL (void);
                     22: 
                     23: glwstate_t glw_state;
                     24: 
                     25: extern cvar_t *vid_fullscreen;
                     26: extern cvar_t *vid_ref;
                     27: 
                     28: static qboolean VerifyDriver( void )
                     29: {
                     30:        char buffer[1024];
                     31: 
                     32:        strcpy( buffer, qglGetString( GL_RENDERER ) );
                     33:        strlwr( buffer );
                     34:        if ( strcmp( buffer, "gdi generic" ) == 0 )
                     35:                if ( !glw_state.mcd_accelerated )
                     36:                        return false;
                     37:        return true;
                     38: }
                     39: 
                     40: /*
                     41: ** VID_CreateWindow
                     42: */
                     43: #define        WINDOW_CLASS_NAME       "Quake 2"
                     44: 
                     45: qboolean VID_CreateWindow( int width, int height, qboolean fullscreen )
                     46: {
                     47:        WNDCLASS                wc;
                     48:        RECT                    r;
                     49:        cvar_t                  *vid_xpos, *vid_ypos;
                     50:        int                             stylebits;
                     51:        int                             x, y, w, h;
                     52:        int                             exstyle;
                     53: 
                     54:        /* Register the frame class */
                     55:     wc.style         = 0;
                     56:     wc.lpfnWndProc   = (WNDPROC)glw_state.wndproc;
                     57:     wc.cbClsExtra    = 0;
                     58:     wc.cbWndExtra    = 0;
                     59:     wc.hInstance     = glw_state.hInstance;
                     60:     wc.hIcon         = 0;
                     61:     wc.hCursor       = LoadCursor (NULL,IDC_ARROW);
                     62:        wc.hbrBackground = (void *)COLOR_GRAYTEXT;
                     63:     wc.lpszMenuName  = 0;
                     64:     wc.lpszClassName = WINDOW_CLASS_NAME;
                     65: 
                     66:     if (!RegisterClass (&wc) )
                     67:                ri.Sys_Error (ERR_FATAL, "Couldn't register window class");
                     68: 
                     69:        if (fullscreen)
                     70:        {
                     71:                exstyle = WS_EX_TOPMOST;
                     72:                stylebits = WS_POPUP|WS_VISIBLE;
                     73:        }
                     74:        else
                     75:        {
                     76:                exstyle = 0;
                     77:                stylebits = WINDOW_STYLE;
                     78:        }
                     79: 
                     80:        r.left = 0;
                     81:        r.top = 0;
                     82:        r.right  = width;
                     83:        r.bottom = height;
                     84: 
                     85:        AdjustWindowRect (&r, stylebits, FALSE);
                     86: 
                     87:        w = r.right - r.left;
                     88:        h = r.bottom - r.top;
                     89: 
                     90:        if (fullscreen)
                     91:        {
                     92:                x = 0;
                     93:                y = 0;
                     94:        }
                     95:        else
                     96:        {
                     97:                vid_xpos = ri.Cvar_Get ("vid_xpos", "0", 0);
                     98:                vid_ypos = ri.Cvar_Get ("vid_ypos", "0", 0);
                     99:                x = vid_xpos->value;
                    100:                y = vid_ypos->value;
                    101:        }
                    102: 
                    103:        glw_state.hWnd = CreateWindowEx (
                    104:                 exstyle, 
                    105:                 WINDOW_CLASS_NAME,
                    106:                 "Quake 2",
                    107:                 stylebits,
                    108:                 x, y, w, h,
                    109:                 NULL,
                    110:                 NULL,
                    111:                 glw_state.hInstance,
                    112:                 NULL);
                    113: 
                    114:        if (!glw_state.hWnd)
                    115:                ri.Sys_Error (ERR_FATAL, "Couldn't create window");
                    116:        
                    117:        ShowWindow( glw_state.hWnd, SW_SHOW );
                    118:        UpdateWindow( glw_state.hWnd );
                    119: 
                    120:        // init all the gl stuff for the window
                    121:        if (!GLimp_InitGL ())
                    122:        {
                    123:                ri.Con_Printf( PRINT_ALL, "VID_CreateWindow() - GLimp_InitGL failed\n");
                    124:                return false;
                    125:        }
                    126: 
                    127:        SetForegroundWindow( glw_state.hWnd );
                    128:        SetFocus( glw_state.hWnd );
                    129: 
                    130:        // let the sound and input subsystems know about the new window
                    131:        ri.Vid_NewWindow (width, height);
                    132: 
                    133:        return true;
                    134: }
                    135: 
                    136: 
                    137: /*
                    138: ** GLimp_SetMode
                    139: */
                    140: rserr_t GLimp_SetMode( int *pwidth, int *pheight, int mode, qboolean fullscreen )
                    141: {
                    142:        int width, height;
                    143:        const char *win_fs[] = { "W", "FS" };
                    144: 
                    145:        ri.Con_Printf( PRINT_ALL, "Initializing OpenGL display\n");
                    146: 
                    147:        ri.Con_Printf (PRINT_ALL, "...setting mode %d:", mode );
                    148: 
                    149:        if ( !ri.Vid_GetModeInfo( &width, &height, mode ) )
                    150:        {
                    151:                ri.Con_Printf( PRINT_ALL, " invalid mode\n" );
                    152:                return rserr_invalid_mode;
                    153:        }
                    154: 
                    155:        ri.Con_Printf( PRINT_ALL, " %d %d %s\n", width, height, win_fs[fullscreen] );
                    156: 
                    157:        // destroy the existing window
                    158:        if (glw_state.hWnd)
                    159:        {
                    160:                GLimp_Shutdown ();
                    161:        }
                    162: 
                    163:        // do a CDS if needed
                    164:        if ( fullscreen )
                    165:        {
                    166:                DEVMODE dm;
                    167: 
                    168:                ri.Con_Printf( PRINT_ALL, "...attempting fullscreen\n" );
                    169: 
                    170:                memset( &dm, 0, sizeof( dm ) );
                    171: 
                    172:                dm.dmSize = sizeof( dm );
                    173: 
                    174:                dm.dmPelsWidth  = width;
                    175:                dm.dmPelsHeight = height;
                    176:                dm.dmFields     = DM_PELSWIDTH | DM_PELSHEIGHT;
                    177: 
                    178:                if ( gl_bitdepth->value != 0 )
                    179:                {
                    180:                        dm.dmBitsPerPel = gl_bitdepth->value;
                    181:                        dm.dmFields |= DM_BITSPERPEL;
                    182:                        ri.Con_Printf( PRINT_ALL, "...using gl_bitdepth of %d\n", ( int ) gl_bitdepth->value );
                    183:                }
                    184:                else
                    185:                {
                    186:                        HDC hdc = GetDC( NULL );
                    187:                        int bitspixel = GetDeviceCaps( hdc, BITSPIXEL );
                    188: 
                    189:                        ri.Con_Printf( PRINT_ALL, "...using desktop display depth of %d\n", bitspixel );
                    190: 
                    191:                        ReleaseDC( 0, hdc );
                    192:                }
                    193: 
                    194:                ri.Con_Printf( PRINT_ALL, "...calling CDS: " );
                    195:                if ( ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) == DISP_CHANGE_SUCCESSFUL )
                    196:                {
                    197:                        *pwidth = width;
                    198:                        *pheight = height;
                    199: 
                    200:                        gl_state.fullscreen = true;
                    201: 
                    202:                        ri.Con_Printf( PRINT_ALL, "ok\n" );
                    203: 
                    204:                        if ( !VID_CreateWindow (width, height, true) )
                    205:                                return rserr_invalid_mode;
                    206: 
                    207:                        return rserr_ok;
                    208:                }
                    209:                else
                    210:                {
                    211:                        *pwidth = width;
                    212:                        *pheight = height;
                    213: 
                    214:                        ri.Con_Printf( PRINT_ALL, "failed\n" );
                    215: 
                    216:                        ri.Con_Printf( PRINT_ALL, "...calling CDS assuming dual monitors:" );
                    217: 
                    218:                        dm.dmPelsWidth = width * 2;
                    219:                        dm.dmPelsHeight = height;
                    220:                        dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
                    221: 
                    222:                        if ( gl_bitdepth->value != 0 )
                    223:                        {
                    224:                                dm.dmBitsPerPel = gl_bitdepth->value;
                    225:                                dm.dmFields |= DM_BITSPERPEL;
                    226:                        }
                    227: 
                    228:                        /*
                    229:                        ** our first CDS failed, so maybe we're running on some weird dual monitor
                    230:                        ** system 
                    231:                        */
                    232:                        if ( ChangeDisplaySettings( &dm, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
                    233:                        {
                    234:                                ri.Con_Printf( PRINT_ALL, " failed\n" );
                    235: 
                    236:                                ri.Con_Printf( PRINT_ALL, "...setting windowed mode\n" );
                    237: 
                    238:                                ChangeDisplaySettings( 0, 0 );
                    239: 
                    240:                                *pwidth = width;
                    241:                                *pheight = height;
                    242:                                gl_state.fullscreen = false;
                    243:                                if ( !VID_CreateWindow (width, height, false) )
                    244:                                        return rserr_invalid_mode;
                    245:                                return rserr_invalid_fullscreen;
                    246:                        }
                    247:                        else
                    248:                        {
                    249:                                ri.Con_Printf( PRINT_ALL, " ok\n" );
                    250:                                if ( !VID_CreateWindow (width, height, true) )
                    251:                                        return rserr_invalid_mode;
                    252: 
                    253:                                gl_state.fullscreen = true;
                    254:                                return rserr_ok;
                    255:                        }
                    256:                }
                    257:        }
                    258:        else
                    259:        {
                    260:                ri.Con_Printf( PRINT_ALL, "...setting windowed mode\n" );
                    261: 
                    262:                ChangeDisplaySettings( 0, 0 );
                    263: 
                    264:                *pwidth = width;
                    265:                *pheight = height;
                    266:                gl_state.fullscreen = false;
                    267:                if ( !VID_CreateWindow (width, height, false) )
                    268:                        return rserr_invalid_mode;
                    269:        }
                    270: 
                    271:        return rserr_ok;
                    272: }
                    273: 
                    274: /*
                    275: ** GLimp_Shutdown
                    276: **
                    277: ** This routine does all OS specific shutdown procedures for the OpenGL
                    278: ** subsystem.  Under OpenGL this means NULLing out the current DC and
                    279: ** HGLRC, deleting the rendering context, and releasing the DC acquired
                    280: ** for the window.  The state structure is also nulled out.
                    281: **
                    282: */
                    283: void GLimp_Shutdown( void )
                    284: {
                    285:        if ( qwglMakeCurrent && !qwglMakeCurrent( NULL, NULL ) )
                    286:                ri.Con_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - wglMakeCurrent failed\n");
                    287:        if ( glw_state.hGLRC )
                    288:        {
                    289:                if (  qwglDeleteContext && !qwglDeleteContext( glw_state.hGLRC ) )
                    290:                        ri.Con_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - wglDeleteContext failed\n");
                    291:                glw_state.hGLRC = NULL;
                    292:        }
                    293:        if (glw_state.hDC)
                    294:        {
                    295:                if ( !ReleaseDC( glw_state.hWnd, glw_state.hDC ) )
                    296:                        ri.Con_Printf( PRINT_ALL, "ref_gl::R_Shutdown() - ReleaseDC failed\n" );
                    297:                glw_state.hDC   = NULL;
                    298:        }
                    299:        if (glw_state.hWnd)
                    300:        {
                    301:                DestroyWindow ( glw_state.hWnd );
                    302:                glw_state.hWnd = NULL;
                    303:        }
                    304: 
                    305:        if ( glw_state.log_fp )
                    306:        {
                    307:                fclose( glw_state.log_fp );
                    308:                glw_state.log_fp = 0;
                    309:        }
                    310: 
                    311:        UnregisterClass (WINDOW_CLASS_NAME, glw_state.hInstance);
                    312: 
                    313:        if ( gl_state.fullscreen )
                    314:        {
                    315:                ChangeDisplaySettings( 0, 0 );
                    316:                gl_state.fullscreen = false;
                    317:        }
                    318: }
                    319: 
                    320: 
                    321: /*
                    322: ** GLimp_Init
                    323: **
                    324: ** This routine is responsible for initializing the OS specific portions
                    325: ** of OpenGL.  Under Win32 this means dealing with the pixelformats and
                    326: ** doing the wgl interface stuff.
                    327: */
                    328: qboolean GLimp_Init( void *hinstance, void *wndproc )
                    329: {
                    330: #define OSR2_BUILD_NUMBER 1111
                    331: 
                    332:        OSVERSIONINFO   vinfo;
                    333: 
                    334:        vinfo.dwOSVersionInfoSize = sizeof(vinfo);
                    335: 
                    336:        glw_state.allowdisplaydepthchange = false;
                    337: 
                    338:        if ( GetVersionEx( &vinfo) )
                    339:        {
                    340:                if ( vinfo.dwMajorVersion > 4 )
                    341:                {
                    342:                        glw_state.allowdisplaydepthchange = true;
                    343:                }
                    344:                else if ( vinfo.dwMajorVersion == 4 )
                    345:                {
                    346:                        if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT )
                    347:                        {
                    348:                                glw_state.allowdisplaydepthchange = true;
                    349:                        }
                    350:                        else if ( vinfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
                    351:                        {
                    352:                                if ( LOWORD( vinfo.dwBuildNumber ) >= OSR2_BUILD_NUMBER )
                    353:                                {
                    354:                                        glw_state.allowdisplaydepthchange = true;
                    355:                                }
                    356:                        }
                    357:                }
                    358:        }
                    359:        else
                    360:        {
                    361:                ri.Con_Printf( PRINT_ALL, "GLimp_Init() - GetVersionEx failed\n" );
                    362:                return false;
                    363:        }
                    364: 
                    365:        glw_state.hInstance = ( HINSTANCE ) hinstance;
                    366:        glw_state.wndproc = wndproc;
                    367: 
                    368:        return true;
                    369: }
                    370: 
                    371: qboolean GLimp_InitGL (void)
                    372: {
                    373:     PIXELFORMATDESCRIPTOR pfd = 
                    374:        {
                    375:                sizeof(PIXELFORMATDESCRIPTOR),  // size of this pfd
                    376:                1,                                                              // version number
                    377:                PFD_DRAW_TO_WINDOW |                    // support window
                    378:                PFD_SUPPORT_OPENGL |                    // support OpenGL
                    379:                PFD_DOUBLEBUFFER,                               // double buffered
                    380:                PFD_TYPE_RGBA,                                  // RGBA type
                    381:                24,                                                             // 24-bit color depth
                    382:                0, 0, 0, 0, 0, 0,                               // color bits ignored
                    383:                0,                                                              // no alpha buffer
                    384:                0,                                                              // shift bit ignored
                    385:                0,                                                              // no accumulation buffer
                    386:                0, 0, 0, 0,                                     // accum bits ignored
                    387:                32,                                                             // 32-bit z-buffer      
                    388:                0,                                                              // no stencil buffer
                    389:                0,                                                              // no auxiliary buffer
                    390:                PFD_MAIN_PLANE,                                 // main layer
                    391:                0,                                                              // reserved
                    392:                0, 0, 0                                                 // layer masks ignored
                    393:     };
                    394:     int  pixelformat;
                    395:        cvar_t *stereo;
                    396:        
                    397:        stereo = ri.Cvar_Get( "cl_stereo", "0", 0 );
                    398: 
                    399:        /*
                    400:        ** set PFD_STEREO if necessary
                    401:        */
                    402:        if ( stereo->value != 0 )
                    403:        {
                    404:                ri.Con_Printf( PRINT_ALL, "...attempting to use stereo\n" );
                    405:                pfd.dwFlags |= PFD_STEREO;
                    406:                gl_state.stereo_enabled = true;
                    407:        }
                    408:        else
                    409:        {
                    410:                gl_state.stereo_enabled = false;
                    411:        }
                    412: 
                    413:        /*
                    414:        ** figure out if we're running on a minidriver or not
                    415:        */
                    416:        if ( strstr( gl_driver->string, "opengl32" ) != 0 )
                    417:                glw_state.minidriver = false;
                    418:        else
                    419:                glw_state.minidriver = true;
                    420: 
                    421:        /*
                    422:        ** Get a DC for the specified window
                    423:        */
                    424:        if ( glw_state.hDC != NULL )
                    425:                ri.Con_Printf( PRINT_ALL, "GLimp_Init() - non-NULL DC exists\n" );
                    426: 
                    427:     if ( ( glw_state.hDC = GetDC( glw_state.hWnd ) ) == NULL )
                    428:        {
                    429:                ri.Con_Printf( PRINT_ALL, "GLimp_Init() - GetDC failed\n" );
                    430:                return false;
                    431:        }
                    432: 
                    433:        if ( glw_state.minidriver )
                    434:        {
                    435:                if ( (pixelformat = qwglChoosePixelFormat( glw_state.hDC, &pfd)) == 0 )
                    436:                {
                    437:                        ri.Con_Printf (PRINT_ALL, "GLimp_Init() - qwglChoosePixelFormat failed\n");
                    438:                        return false;
                    439:                }
                    440:                if ( qwglSetPixelFormat( glw_state.hDC, pixelformat, &pfd) == FALSE )
                    441:                {
                    442:                        ri.Con_Printf (PRINT_ALL, "GLimp_Init() - qwglSetPixelFormat failed\n");
                    443:                        return false;
                    444:                }
                    445:                qwglDescribePixelFormat( glw_state.hDC, pixelformat, sizeof( pfd ), &pfd );
                    446:        }
                    447:        else
                    448:        {
                    449:                if ( ( pixelformat = ChoosePixelFormat( glw_state.hDC, &pfd)) == 0 )
                    450:                {
                    451:                        ri.Con_Printf (PRINT_ALL, "GLimp_Init() - ChoosePixelFormat failed\n");
                    452:                        return false;
                    453:                }
                    454:                if ( SetPixelFormat( glw_state.hDC, pixelformat, &pfd) == FALSE )
                    455:                {
                    456:                        ri.Con_Printf (PRINT_ALL, "GLimp_Init() - SetPixelFormat failed\n");
                    457:                        return false;
                    458:                }
                    459:                DescribePixelFormat( glw_state.hDC, pixelformat, sizeof( pfd ), &pfd );
                    460: 
                    461:                if ( !( pfd.dwFlags & PFD_GENERIC_ACCELERATED ) )
                    462:                {
                    463:                        extern cvar_t *gl_allow_software;
                    464: 
                    465:                        if ( gl_allow_software->value )
                    466:                                glw_state.mcd_accelerated = true;
                    467:                        else
                    468:                                glw_state.mcd_accelerated = false;
                    469:                }
                    470:                else
                    471:                {
                    472:                        glw_state.mcd_accelerated = true;
                    473:                }
                    474:        }
                    475: 
                    476:        /*
                    477:        ** report if stereo is desired but unavailable
                    478:        */
                    479:        if ( !( pfd.dwFlags & PFD_STEREO ) && ( stereo->value != 0 ) ) 
                    480:        {
                    481:                ri.Con_Printf( PRINT_ALL, "...failed to select stereo pixel format\n" );
                    482:                ri.Cvar_SetValue( "cl_stereo", 0 );
                    483:                gl_state.stereo_enabled = false;
                    484:        }
                    485: 
                    486:        /*
                    487:        ** startup the OpenGL subsystem by creating a context and making
                    488:        ** it current
                    489:        */
                    490:        if ( ( glw_state.hGLRC = qwglCreateContext( glw_state.hDC ) ) == 0 )
                    491:        {
                    492:                ri.Con_Printf (PRINT_ALL, "GLimp_Init() - qwglCreateContext failed\n");
                    493: 
                    494:                goto fail;
                    495:        }
                    496: 
                    497:     if ( !qwglMakeCurrent( glw_state.hDC, glw_state.hGLRC ) )
                    498:        {
                    499:                ri.Con_Printf (PRINT_ALL, "GLimp_Init() - qwglMakeCurrent failed\n");
                    500: 
                    501:                goto fail;
                    502:        }
                    503: 
                    504:        if ( !VerifyDriver() )
                    505:        {
                    506:                ri.Con_Printf( PRINT_ALL, "GLimp_Init() - no hardware acceleration detected\n" );
                    507:                goto fail;
                    508:        }
                    509: 
                    510:        /*
                    511:        ** print out PFD specifics 
                    512:        */
                    513:        ri.Con_Printf( PRINT_ALL, "GL PFD: color(%d-bits) Z(%d-bit)\n", ( int ) pfd.cColorBits, ( int ) pfd.cDepthBits );
                    514: 
                    515:        return true;
                    516: 
                    517: fail:
                    518:        if ( glw_state.hGLRC )
                    519:        {
                    520:                qwglDeleteContext( glw_state.hGLRC );
                    521:                glw_state.hGLRC = NULL;
                    522:        }
                    523: 
                    524:        if ( glw_state.hDC )
                    525:        {
                    526:                ReleaseDC( glw_state.hWnd, glw_state.hDC );
                    527:                glw_state.hDC = NULL;
                    528:        }
                    529:        return false;
                    530: }
                    531: 
                    532: /*
                    533: ** GLimp_BeginFrame
                    534: */
                    535: void GLimp_BeginFrame( float camera_separation )
                    536: {
                    537:        if ( gl_bitdepth->modified )
                    538:        {
                    539:                if ( gl_bitdepth->value != 0 && !glw_state.allowdisplaydepthchange )
                    540:                {
                    541:                        ri.Cvar_SetValue( "gl_bitdepth", 0 );
                    542:                        ri.Con_Printf( PRINT_ALL, "gl_bitdepth requires Win95 OSR2.x or WinNT 4.x\n" );
                    543:                }
                    544:                gl_bitdepth->modified = false;
                    545:        }
                    546: 
                    547:        if ( camera_separation < 0 && gl_state.stereo_enabled )
                    548:        {
                    549:                qglDrawBuffer( GL_BACK_LEFT );
                    550:        }
                    551:        else if ( camera_separation > 0 && gl_state.stereo_enabled )
                    552:        {
                    553:                qglDrawBuffer( GL_BACK_RIGHT );
                    554:        }
                    555:        else
                    556:        {
                    557:                qglDrawBuffer( GL_BACK );
                    558:        }
                    559: }
                    560: 
                    561: /*
                    562: ** GLimp_EndFrame
                    563: ** 
                    564: ** Responsible for doing a swapbuffers and possibly for other stuff
                    565: ** as yet to be determined.  Probably better not to make this a GLimp
                    566: ** function and instead do a call to GLimp_SwapBuffers.
                    567: */
                    568: void GLimp_EndFrame (void)
                    569: {
                    570:        int             err;
                    571: 
                    572:        err = qglGetError();
                    573:        assert( err == GL_NO_ERROR );
                    574: 
                    575:        if ( stricmp( gl_drawbuffer->string, "GL_BACK" ) == 0 )
                    576:        {
                    577:                if ( !qwglSwapBuffers( glw_state.hDC ) )
                    578:                        ri.Sys_Error( ERR_FATAL, "GLimp_EndFrame() - SwapBuffers() failed!\n" );
                    579:        }
                    580: }
                    581: 
                    582: /*
                    583: ** GLimp_AppActivate
                    584: */
                    585: void GLimp_AppActivate( qboolean active )
                    586: {
                    587:        if ( active )
                    588:        {
                    589:                SetForegroundWindow( glw_state.hWnd );
                    590:                ShowWindow( glw_state.hWnd, SW_RESTORE );
                    591:        }
                    592:        else
                    593:        {
                    594:                if ( vid_fullscreen->value )
                    595:                        ShowWindow( glw_state.hWnd, SW_MINIMIZE );
                    596:        }
                    597: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.