David Rose před 20 roky
rodič
revize
9d9cd8e07b

+ 0 - 82
panda/src/wgldisplay/wglGraphicsPipe.cxx.old

@@ -1,82 +0,0 @@
-// Filename: wglGraphicsPipe.cxx
-// Created by:  mike (09Jan97)
-//
-////////////////////////////////////////////////////////////////////
-//
-// PANDA 3D SOFTWARE
-// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
-//
-// All use of this software is subject to the terms of the Panda 3d
-// Software license.  You should have received a copy of this license
-// along with this source code; you will also find a current copy of
-// the license at http://www.panda3d.org/license.txt .
-//
-// To contact the maintainers of this program write to
-// [email protected] .
-//
-////////////////////////////////////////////////////////////////////
-#include "wglGraphicsPipe.h"
-#include "config_wgldisplay.h"
-
-////////////////////////////////////////////////////////////////////
-// Static variables
-////////////////////////////////////////////////////////////////////
-TypeHandle wglGraphicsPipe::_type_handle;
-
-wglGraphicsPipe::wglGraphicsPipe(const PipeSpecifier& spec)
-  : InteractiveGraphicsPipe(spec)
-{}
-
-////////////////////////////////////////////////////////////////////
-//     Function: wglGraphicsPipe::get_window_type
-//       Access: Public, Virtual
-//  Description: Returns the TypeHandle of the kind of window
-//               preferred by this kind of pipe.
-////////////////////////////////////////////////////////////////////
-TypeHandle wglGraphicsPipe::
-get_window_type() const {
-  return wglGraphicsWindow::get_class_type();
-}
-
-GraphicsPipe *wglGraphicsPipe::
-make_wglGraphicsPipe(const FactoryParams &params) {
-  GraphicsPipe::PipeSpec *pipe_param;
-  if (!get_param_into(pipe_param, params)) {
-    return new wglGraphicsPipe(PipeSpecifier());
-  } else {
-    return new wglGraphicsPipe(pipe_param->get_specifier());
-  }
-}
-
-
-TypeHandle wglGraphicsPipe::get_class_type(void) {
-  return _type_handle;
-}
-
-const char *pipe_type_name="wglGraphicsPipe";
-
-void wglGraphicsPipe::init_type(void) {
-  InteractiveGraphicsPipe::init_type();
-  register_type(_type_handle, pipe_type_name,
-        InteractiveGraphicsPipe::get_class_type());
-}
-
-TypeHandle wglGraphicsPipe::get_type(void) const {
-  return get_class_type();
-}
-
-wglGraphicsPipe::wglGraphicsPipe(void) {
-  wgldisplay_cat.error()
-    << pipe_type_name <<"s should not be created with the default constructor" << endl;
-}
-
-wglGraphicsPipe::wglGraphicsPipe(const wglGraphicsPipe&) {
-  wgldisplay_cat.error()
-    << pipe_type_name << "s should not be copied" << endl;
-}
-
-wglGraphicsPipe& wglGraphicsPipe::operator=(const wglGraphicsPipe&) {
-  wgldisplay_cat.error() 
-  << pipe_type_name << "s should not be assigned" << endl;
-  return *this;
-}

+ 0 - 63
panda/src/wgldisplay/wglGraphicsPipe.h.old

@@ -1,63 +0,0 @@
-// Filename: wglGraphicsPipe.h
-// Created by:  mike (09Jan97)
-//
-////////////////////////////////////////////////////////////////////
-//
-// PANDA 3D SOFTWARE
-// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
-//
-// All use of this software is subject to the terms of the Panda 3d
-// Software license.  You should have received a copy of this license
-// along with this source code; you will also find a current copy of
-// the license at http://www.panda3d.org/license.txt .
-//
-// To contact the maintainers of this program write to
-// [email protected] .
-//
-////////////////////////////////////////////////////////////////////
-#ifndef WGLGRAPHICSPIPE_H
-#define WGLGRAPHICSPIPE_H
-//
-////////////////////////////////////////////////////////////////////
-// Includes
-////////////////////////////////////////////////////////////////////
-#include <pandabase.h>
-
-#include <string>
-#include <interactiveGraphicsPipe.h>
-#include "wglGraphicsWindow.h"
-#define WINDOWS_LEAN_AND_MEAN
-#include <windows.h>
-#undef WINDOWS_LEAN_AND_MEAN
-
-////////////////////////////////////////////////////////////////////
-//       Class : wglGraphicsPipe
-// Description :
-////////////////////////////////////////////////////////////////////
-class EXPCL_PANDAGL wglGraphicsPipe : public InteractiveGraphicsPipe {
-public:
-  wglGraphicsPipe(const PipeSpecifier&);
-
-  virtual TypeHandle get_window_type() const;
-
-public:
-
-  static GraphicsPipe* make_wglGraphicsPipe(const FactoryParams &params);
-
-  static TypeHandle get_class_type();
-  static void init_type();
-  virtual TypeHandle get_type() const;
-  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
-
-private:
-
-  static TypeHandle _type_handle;
-
-protected:
-
-  wglGraphicsPipe();
-  wglGraphicsPipe(const wglGraphicsPipe&);
-  wglGraphicsPipe& operator=(const wglGraphicsPipe&);
-};
-
-#endif

+ 0 - 3566
panda/src/wgldisplay/wglGraphicsWindow.cxx.old

@@ -1,3566 +0,0 @@
-// Filename: wcrGraphicsWindow.cxx
-// Created by:
-//
-////////////////////////////////////////////////////////////////////
-//
-// PANDA 3D SOFTWARE
-// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
-//
-// All use of this software is subject to the terms of the Panda 3d
-// Software license.  You should have received a copy of this license
-// along with this source code; you will also find a current copy of
-// the license at http://www.panda3d.org/license.txt .
-//
-// To contact the maintainers of this program write to
-// [email protected] .
-//
-////////////////////////////////////////////////////////////////////
-
-#include "wglGraphicsWindow.h"
-#include "wglGraphicsPipe.h"
-#include "config_wgldisplay.h"
-#include <keyboardButton.h>
-#include <mouseButton.h>
-#include <glGraphicsStateGuardian.h>
-#include <errno.h>
-#include <time.h>
-#include <mmsystem.h>
-#include <ddraw.h>
-#include <tchar.h>
-#include <map>
-#include <throw_event.h>
-//#include <eventQueue.h>
-#include <string.h>
-#include "Win32Defs.h"
-
-#ifdef DO_PSTATS
-#include <pStatTimer.h>
-#endif
-
-#define WGL_WGLEXT_PROTOTYPES
-#include "wglext.h"
-
-////////////////////////////////////////////////////////////////////
-// Static variables
-////////////////////////////////////////////////////////////////////
-TypeHandle wglGraphicsWindow::_type_handle;
-
-static bool wc_registered = false;
-
-#define FONT_BITMAP_OGLDISPLAYLISTNUM 1000    // an arbitrary ID #
-
-#define LAST_ERROR 0
-#define ERRORBOX_TITLE "Panda3D Error"
-#define WGL_WINDOWCLASSNAME "wglDisplay"
-
-#define PAUSED_TIMER_ID  7   // completely arbitrary choice
-
-typedef map<HWND,wglGraphicsWindow *> HWND_PANDAWIN_MAP;
-
-HWND_PANDAWIN_MAP hwnd_pandawin_map;
-wglGraphicsWindow *global_wglwinptr=NULL;  // need this for temporary windproc
-
-typedef enum {Software, MCD, ICD} OGLDriverType;
-static char *OGLDrvStrings[3] = {"Software","MCD","ICD"};
-
-LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam,LPARAM lparam);
-extern char *ConvDDErrorToString(const HRESULT &error);
-
-// because we dont have access to ModifierButtons, as a hack just synchronize state of these
-// keys on get/lose keybd focus
-#define NUM_MODIFIER_KEYS 16
-unsigned int hardcoded_modifier_buttons[NUM_MODIFIER_KEYS]={VK_SHIFT,VK_MENU,VK_CONTROL,VK_SPACE,VK_TAB,
-                                         VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_PRIOR,VK_NEXT,VK_HOME,VK_END,
-                                         VK_INSERT,VK_DELETE,VK_ESCAPE};
-
-// dont pick any video modes < MIN_REFRESH_RATE Hz
-#define MIN_REFRESH_RATE 60
-// EnumDisplaySettings may indicate 0 or 1 for refresh rate, which means use driver default rate (assume its >min_refresh_rate)
-#define ACCEPTABLE_REFRESH_RATE(RATE) ((RATE >= MIN_REFRESH_RATE) || (RATE==0) || (RATE==1))
-
-void PrintErrorMessage(DWORD msgID) {
-   LPTSTR pMessageBuffer;
-
-   if (msgID==LAST_ERROR)
-     msgID=GetLastError();
-
-   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
-                 NULL,msgID,
-                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
-                 (LPTSTR) &pMessageBuffer,  // the weird ptrptr->ptr cast is intentional, see FORMAT_MESSAGE_ALLOCATE_BUFFER
-                 1024, NULL);
-   MessageBox(GetDesktopWindow(),pMessageBuffer,_T(ERRORBOX_TITLE),MB_OK);
-   wgldisplay_cat.fatal() << "System error msg: " << pMessageBuffer << endl;
-   LocalFree(pMessageBuffer);
-}
-
-// fn exists so AtExitFn can call it without refcntr blowing up since its !=0
-void wglGraphicsWindow::DestroyMe(bool bAtExitFnCalled) {
-
-  _exiting_window = true;  // needed before DestroyWindow call
-
-  // several GL drivers (voodoo,ATI, not nvidia) crash if we call these wgl deletion routines from
-  // an atexit() fn.  Possible that GL has already unloaded itself.  So we just wont call them for now
-  // for that case, we're exiting the app anyway.
-  if (!bAtExitFnCalled) {
-      // to do gl releases, we need to have the context be current
-      if ((_hdc!=NULL)&&(_context!=NULL)) {
-          // need to bypass make_current() since it checks _window_active which we need to ignore
-          HGLRC current_context = wglGetCurrentContext();
-          HDC current_dc = wglGetCurrentDC();
-
-          if ((current_context != _context) || (current_dc != _hdc)) {
-              if (!wglMakeCurrent(_hdc, _context)) {
-                  PrintErrorMessage(LAST_ERROR);
-              }
-          }
-          report_errors();
-      }
-
-      if (gl_show_fps_meter)
-        glDeleteLists(FONT_BITMAP_OGLDISPLAYLISTNUM, 128);
-
-      report_errors();
-
-      // implicitly calls gsg destructors which release GL objects (textures, display lists, etc)
-      release_gsg();
-
-      report_errors();
-      // cant report errors after we set cur context to NULL
-
-      HGLRC curcxt=wglGetCurrentContext();
-      if (curcxt!=NULL)
-        unmake_current();
-
-      if (_context!=NULL) {
-          wglDeleteContext(_context);
-          _context = NULL;
-      }
-  }
-
-  if (_hdc!=NULL) {
-    ReleaseDC(_mwindow,_hdc);
-    _hdc = NULL;
-  }
-
-  if ((_hOldForegroundWindow!=NULL) && (_mwindow==GetForegroundWindow())) {
-      SetForegroundWindow(_hOldForegroundWindow);
-  }
-
-  if (_mwindow!=NULL) {
-    if (_bLoadedCustomCursor && _hMouseCursor!=NULL)
-      DestroyCursor(_hMouseCursor);
-
-    DestroyWindow(_mwindow);
-    hwnd_pandawin_map.erase(_mwindow);
-    _mwindow = NULL;
-  }
-
-  if (_pCurrent_display_settings!=NULL) {
-      delete _pCurrent_display_settings;
-      _pCurrent_display_settings = NULL;
-  }
-
-  if (_props._fullscreen) {
-      // revert to default display mode
-      ChangeDisplaySettings(NULL,0x0);
-  }
-}
-
-void wglGraphicsWindow::do_close_window() {
-  GraphicsWindow::do_close_window();
-   DestroyMe(false);
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Destructor
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-wglGraphicsWindow::~wglGraphicsWindow() {
-   close_window();
-}
-
-void DestroyAllWindows(bool bAtExitFnCalled) {
-   // need to go through all windows in map var and delete them
-   while(!hwnd_pandawin_map.empty()) {
-     // cant use a for loop cause DestroyMe erases things out from under us, so iterator is invalid
-     HWND_PANDAWIN_MAP::iterator pwin = hwnd_pandawin_map.begin();
-     if ((*pwin).second != NULL)
-         (*pwin).second->DestroyMe(bAtExitFnCalled);
-   }
-}
-
-void AtExitFn() {
-#ifdef _DEBUG
-    wgldisplay_cat.spam() << "AtExitFn called\n";
-#endif
-
-     restore_global_parameters();
-
-     DestroyAllWindows(true);
-}
-
-// spare me the trouble of linking with dxguid.lib or defining ALL the dx guids in this .obj by #defining INITGUID
-#define MY_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \
-        EXTERN_C const GUID DECLSPEC_SELECTANY name \
-                = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }
-
-MY_DEFINE_GUID(IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,0xB9,0x33,0x56);
-
-////////////////////////////////////////////////////////////////////
-//  Function: GetAvailVidMem
-//  Description: Uses DDraw to get available video memory
-////////////////////////////////////////////////////////////////////
-static DWORD GetAvailVidMem() {
-
-    LPDIRECTDRAW2 pDD2;
-    LPDIRECTDRAW pDD;
-    HRESULT hr;
-
-    typedef HRESULT (WINAPI *DIRECTDRAWCREATEPROC)(GUID FAR *lpGUID,LPDIRECTDRAW FAR *lplpDD,IUnknown FAR *pUnkOuter);
-    DIRECTDRAWCREATEPROC pfnDDCreate=NULL;
-
-    HINSTANCE DDHinst = LoadLibrary("ddraw.dll");
-    if (DDHinst == 0) {
-        wgldisplay_cat.fatal() << "LoadLibrary() can't find DDRAW.DLL!" << endl;
-        exit(1);
-    }
-
-    pfnDDCreate = (DIRECTDRAWCREATEPROC) GetProcAddress(DDHinst, "DirectDrawCreate");
-
-    // just use DX5 DD interface, since that's the minimum ver we need
-    if (NULL == pfnDDCreate) {
-        wgldisplay_cat.fatal() << "GetProcAddress failed on DirectDrawCreate\n";
-        exit(1);
-    }
-
-    // Create the Direct Draw Object
-    hr = (*pfnDDCreate)((GUID *)DDCREATE_HARDWAREONLY, &pDD, NULL);
-    if (hr != DD_OK) {
-        wgldisplay_cat.fatal()
-        << "DirectDrawCreate failed : result = " << ConvDDErrorToString(hr) << endl;
-        exit(1);
-    }
-
-    FreeLibrary(DDHinst);    //undo LoadLib above, decrement ddrawl.dll refcnt (after DDrawCreate, since dont want to unload/reload)
-
-    // need DDraw2 interface for GetAvailVidMem
-    hr = pDD->QueryInterface(IID_IDirectDraw2, (LPVOID *)&pDD2);
-    if (hr != DD_OK) {
-        wgldisplay_cat.fatal() << "DDraw QueryInterface failed : result = " << ConvDDErrorToString(hr) << endl;
-        exit(1);
-     }
-
-    pDD->Release();
-
-    // Now we try to figure out if we can use requested screen resolution and best
-    // rendertarget bpp and still have at least 2 meg of texture vidmem
-
-    // Get Current VidMem avail.  Note this is only an estimate, when we switch to fullscreen
-    // mode from desktop, more vidmem will be available (typically 1.2 meg).  I dont want
-    // to switch to fullscreen more than once due to the annoying monitor flicker, so try
-    // to figure out optimal mode using this estimate
-    DDSCAPS ddsCaps;
-    DWORD dwTotal,dwFree;
-    ZeroMemory(&ddsCaps,sizeof(DDSCAPS));
-    ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM;  // dont count AGP mem!
-    if (FAILED(hr = pDD2->GetAvailableVidMem(&ddsCaps,&dwTotal,&dwFree))) {
-        if (hr==DDERR_NODIRECTDRAWHW) {
-           if (wgldisplay_cat.is_debug())
-               wgldisplay_cat.debug() << "GetAvailableVidMem returns no-DDraw HW, assuming we have plenty of vidmem\n";
-           dwTotal=dwFree=0x7FFFFFFF;
-        } else {
-            wgldisplay_cat.fatal() << "GetAvailableVidMem failed : result = " << ConvDDErrorToString(hr) << endl;
-            exit(1);
-        }
-    } else {
-       if (wgldisplay_cat.is_debug())
-           wgldisplay_cat.debug() << "before FullScreen switch: GetAvailableVidMem returns Total: " << dwTotal/1000000.0 << "  Free: " << dwFree/1000000.0 << endl;
-       if (dwTotal==0) {
-           if (wgldisplay_cat.is_debug())
-               wgldisplay_cat.debug() << "GetAvailVidMem returns bogus total of 0, assuming we have plenty of vidmem\n";
-           dwTotal=dwFree=0x7FFFFFFF;
-       }
-    }
-
-    pDD2->Release();  // bye-bye ddraw
-
-    return dwFree;
-}
-
-bool find_acceptable_display_mode(DWORD dwWidth,DWORD dwHeight,DWORD bpp,DEVMODE &dm) {
-    int modenum=0;
-
-    // look for acceptable mode
-    while(1) {
-        ZeroMemory(&dm, sizeof(dm));
-        dm.dmSize = sizeof(dm);
-
-        if (!EnumDisplaySettings(NULL,modenum,&dm))
-          break;
-
-        if ((dm.dmPelsWidth==dwWidth) && (dm.dmPelsHeight==dwHeight) &&
-           (dm.dmBitsPerPel==bpp) && ACCEPTABLE_REFRESH_RATE(dm.dmDisplayFrequency)) {
-           return true;
-        }
-        modenum++;
-    }
-
-    return false;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: config
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::config() {
-
-    GraphicsWindow::config();
-
-    HINSTANCE hinstance = GetModuleHandle(NULL);
-    HWND hDesktopWindow = GetDesktopWindow();
-
-    global_wglwinptr = this;  // need this until we get an HWND from CreateWindow
-
-    _exiting_window = false;
-    _return_control_to_app = false;
-    _bIsLowVidMemCard = false;
-    _active_minimized_fullscreen = false;
-    _PandaPausedTimer = NULL;
-    _context = NULL;
-    _hdc = NULL;
-    _window_active = true;
-    _pCurrent_display_settings = NULL;
-    _mwindow = NULL;
-    _gsg = NULL;
-    ZeroMemory(&_pixelformat,sizeof(_pixelformat));
-    _hOldForegroundWindow=GetForegroundWindow();
-
-    WNDCLASS wc;
-
-    // these fns arent defined on win95, so get dynamic ptrs to them to avoid
-    // ugly DLL loader failures on w95
-    HINSTANCE hUser32 = (HINSTANCE) LoadLibrary("user32.dll");
-    assert(hUser32);
-    _pfnTrackMouseEvent = (PFN_TRACKMOUSEEVENT) GetProcAddress(hUser32, "TrackMouseEvent");
-    FreeLibrary(hUser32);
-
-    // Clear before filling in window structure!
-    ZeroMemory(&wc, sizeof(WNDCLASS));
-    wc.style      = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
-    wc.lpfnWndProc = (WNDPROC) static_window_proc;
-    wc.hInstance   = hinstance;
-
-    string windows_icon_filename = get_icon_filename_2().to_os_specific();
-    string windows_mono_cursor_filename = get_mono_cursor_filename_2().to_os_specific();
-
-    if (!windows_icon_filename.empty()) {
-        // Note: LoadImage seems to cause win2k internal heap corruption (outputdbgstr warnings)
-        // if icon is more than 8bpp
-
-        // loads a .ico fmt file
-        wc.hIcon = (HICON) LoadImage(NULL, windows_icon_filename.c_str(), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
-
-        if (wc.hIcon==NULL) {
-            wgldisplay_cat.warning() << "windows icon filename '" << windows_icon_filename << "' not found!!\n";
-        }
-    } else {
-        wc.hIcon = NULL; // use default app icon
-    }
-
-    _bLoadedCustomCursor = false;
-    if (!windows_mono_cursor_filename.empty()) {
-        // Note: LoadImage seems to cause win2k internal heap corruption (outputdbgstr warnings)
-        // if icon is more than 8bpp (because it was 'mapping' 16bpp colors to the device?)
-
-        DWORD load_flags = LR_LOADFROMFILE;
-
-        if (_props._fullscreen) {
-          // I think cursors should use LR_CREATEDIBSECTION since they should not be mapped to the device palette (in the case of 256-color cursors)
-          // since they are not going to be used on the desktop
-          load_flags |= LR_CREATEDIBSECTION;
-        }
-
-        // loads a .cur fmt file
-        _hMouseCursor = (HCURSOR) LoadImage(NULL, windows_mono_cursor_filename.c_str(), IMAGE_CURSOR, 0, 0, load_flags);
-
-        if (_hMouseCursor==NULL) {
-            wgldisplay_cat.warning() << "windows cursor filename '" << windows_mono_cursor_filename << "' not found!!\n";
-        }
-        _bLoadedCustomCursor = true;
-    } else {
-        _hMouseCursor = LoadCursor(NULL, IDC_ARROW);
-    }
-
-    if (!wc_registered) {
-      // We only need to register the window class once per session.
-
-      wc.hCursor = _hMouseCursor;  // even if cursor isnt visible, we need to load it so its visible in client-area window border
-      wc.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
-      wc.lpszMenuName   = NULL;
-      wc.lpszClassName  = WGL_WINDOWCLASSNAME;
-
-      if (!RegisterClass(&wc)) {
-        wgldisplay_cat.error() << "could not register window class!" << endl;
-      }
-      wc_registered = true;
-    }
-
-//  from MSDN:
-//  An OpenGL window has its own pixel format. Because of this, only device contexts retrieved
-//  for the client area of an OpenGL window are allowed to draw into the window. As a result, an
-//  OpenGL window should be created with the WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. Additionally,
-//  the window class attribute should not include the CS_PARENTDC style.
-
-    DWORD window_style = WS_POPUP | WS_SYSMENU | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;  // for CreateWindow
-
-    // rect now contains the coords for the entire window, not the client
-    if (_props._fullscreen) {
-      DWORD dwWidth =  _props._xsize;
-      DWORD dwHeight = _props._ysize;
-
-      HDC scrnDC=GetDC(hDesktopWindow);
-      DWORD drvr_ver=GetDeviceCaps(scrnDC,DRIVERVERSION);
-      DWORD cur_bitdepth=GetDeviceCaps(scrnDC,BITSPIXEL);
-      DWORD cur_scrnwidth=GetDeviceCaps(scrnDC,HORZRES);
-      DWORD cur_scrnheight=GetDeviceCaps(scrnDC,VERTRES);
-      ReleaseDC(hDesktopWindow,scrnDC);
-
-      DWORD dwFullScreenBitDepth=cur_bitdepth;
-
-      #define LOWVIDMEMTHRESHOLD 3500000
-      if (gl_do_vidmemsize_check && (GetAvailVidMem() < LOWVIDMEMTHRESHOLD)) {
-          _bIsLowVidMemCard = true;
-          wgldisplay_cat.debug() << "small video memory card detect, switching fullscreen to minimum 640x480x16 config\n";
-          // we're going to need 640x480 at 16 bit to save enough tex vidmem
-          dwFullScreenBitDepth=16;
-          dwWidth=640;
-          dwHeight=480;
-      }
-
-      DEVMODE dm;
-      if (!find_acceptable_display_mode(dwWidth,dwHeight,dwFullScreenBitDepth,dm)) {
-          wgldisplay_cat.fatal() << "Videocard has no supported display resolutions at specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<")\n";
-          exit(1);
-      }
-
-      // I'd prefer to CreateWindow after DisplayChange in case it messes up GL somehow,
-      // but I need the window's black background to cover up the desktop during the mode change
-      _mwindow = CreateWindow(WGL_WINDOWCLASSNAME, _props._title.c_str(),
-                window_style,0,0,dwWidth,dwHeight,hDesktopWindow, NULL, hinstance, 0);
-
-      // move window to top of zorder,
-      SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE);
-
-      ShowWindow(_mwindow, SW_SHOWNORMAL);
-      ShowWindow(_mwindow, SW_SHOWNORMAL);
-
-      if(!SetForegroundWindow(_mwindow)) {
-          wgldisplay_cat.warning() << "SetForegroundWindow() failed!\n";
-      }
-
-      int chg_result = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
-
-      if (chg_result!=DISP_CHANGE_SUCCESSFUL) {
-            wgldisplay_cat.fatal() << "ChangeDisplaySettings failed (error code: " << chg_result <<") for specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<"), " << dm.dmDisplayFrequency  << "Hz\n";
-            exit(1);
-      }
-
-      _pCurrent_display_settings = new(DEVMODE);
-      memcpy(_pCurrent_display_settings,&dm,sizeof(DEVMODE));
-
-      _props._xorg = 0;
-      _props._yorg = 0;
-      _props._xsize = dwWidth;
-      _props._ysize = dwHeight;
-  } else {
-
-        RECT win_rect;
-        SetRect(&win_rect, _props._xorg,  _props._yorg, _props._xorg + _props._xsize,
-                _props._yorg + _props._ysize);
-
-        if (_props._border) {
-            window_style |= WS_OVERLAPPEDWINDOW;
-        }
-
-        BOOL bRes = AdjustWindowRect(&win_rect, window_style, FALSE);  //compute window size based on desired client area size
-
-        if (!bRes) {
-            wgldisplay_cat.fatal() << "AdjustWindowRect failed!" << endl;
-            exit(1);
-        }
-
-        // make sure origin is on screen, slide far bounds over if necessary
-        if (win_rect.left < 0) {
-            win_rect.right += abs(win_rect.left); win_rect.left = 0;
-        }
-        if (win_rect.top < 0) {
-            win_rect.bottom += abs(win_rect.top); win_rect.top = 0;
-        }
-
-        _mwindow = CreateWindow(WGL_WINDOWCLASSNAME, _props._title.c_str(),
-                                window_style, win_rect.left, win_rect.top, win_rect.right-win_rect.left,
-                                win_rect.bottom-win_rect.top,
-                                NULL, NULL, hinstance, 0);
-
-        SetForegroundWindow(_mwindow);
-  }
-
-  wgldisplay_cat.info() << "opening " << _props._xsize << "x" << _props._ysize
-                        << (_props._fullscreen ? " fullscreen" : " regular") << " window\n";
-
-  if (!_mwindow) {
-        wgldisplay_cat.fatal() << "CreateWindow() failed!" << endl;
-        PrintErrorMessage(LAST_ERROR);
-        exit(1);
-  }
-
-  // Determine the initial open status of the IME.
-  _ime_open = false;
-  _ime_active = false;
-  HIMC hIMC = ImmGetContext(_mwindow);
-  if (hIMC != 0) {
-    _ime_open = (ImmGetOpenStatus(hIMC) != 0);
-    ImmReleaseContext(_mwindow, hIMC);
-  }
-
-  // Check the version of the OS we are running.  If we are running
-  // win2000, we must use ImmGetCompositionStringW() to report the
-  // characters returned by the IME, since WM_CHAR and
-  // ImmGetCompositionStringA() both just return question marks.
-  // However, this function doesn't work for Win98; on this OS, we
-  // have to use ImmGetCompositionStringA() instead, which returns an
-  // encoded string in shift-jis (which we then have to decode).
-
-  // For now, this is user-configurable, to allow testing of this code
-  // on both OS's.  After we verify that truth of the above claim, we
-  // should base this decision on GetVersionEx() or maybe
-  // VerifyVersionInfo().
-  _ime_composition_w = ime_composition_w;
-
-  hwnd_pandawin_map[_mwindow] = this;
-  global_wglwinptr = NULL;  // get rid of any reference to this obj
-
-  // move window to top of zorder
-  SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER);
-
-  _hdc = GetDC(_mwindow);
-
-  // Configure the framebuffer according to parameters specified in _props
-  // Initializes _pixelformat
-  int pfnum=choose_visual();
-
-  if (gl_forced_pixfmt!=0) {
-    if (wgldisplay_cat.is_debug())
-      wgldisplay_cat.debug() << "overriding pixfmt choice algorithm (" << pfnum << ") with gl-force-pixfmt("<<gl_forced_pixfmt<< ")\n";
-    pfnum=gl_forced_pixfmt;
-  }
-
-  //  int pfnum=ChoosePixelFormat(_hdc, _pixelformat);
-  if (wgldisplay_cat.is_debug())
-     wgldisplay_cat.debug() << "config() - picking pixfmt #"<< pfnum <<endl;
-
-  if (!SetPixelFormat(_hdc, pfnum, &_pixelformat)) {
-    wgldisplay_cat.fatal()
-      << "config() - SetPixelFormat("<< pfnum << ") failed after window create" << endl;
-    exit(1);
-  }
-
-  // Initializes _colormap
-  setup_colormap();
-
-  _context = wglCreateContext(_hdc);
-  if (!_context) {
-    wgldisplay_cat.fatal()
-      << "config() - failed to create Win32 rendering context" << endl;
-    exit(1);
-  }
-
-  // need to do twice to override any minimized flags in StartProcessInfo
-  ShowWindow(_mwindow, SW_SHOWNORMAL);
-  ShowWindow(_mwindow, SW_SHOWNORMAL);
-
-  // Now indicate that we have our keyboard/mouse device ready.
-  GraphicsWindowInputDevice device =
-    GraphicsWindowInputDevice::pointer_and_keyboard("keyboard/mouse");
-  _input_devices.push_back(device);
-
-  // Create a GSG to manage the graphics
-  // First make the new context and window the current one so GL knows how
-  // to configure itself in the gsg
-  make_current();
-  make_gsg();
-
-  check_for_color_cursor_support();
-
-//  _glgsg = DCAST(GLGraphicsStateGuardian, _gsg);   dont need this now
-
-  string tmpstr((char*)glGetString(GL_EXTENSIONS));
-
-  _extensions_str = tmpstr;
-
-  PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT = NULL;
-  PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB = NULL;
-
-  if (!support_wiregl) {
-    wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB");
-    wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)wglGetProcAddress("wglGetExtensionsStringEXT");
-  }
-
-  if (wglGetExtensionsStringARB!=NULL) {
-       _extensions_str += " ";
-       const char *ARBextensions = wglGetExtensionsStringARB(wglGetCurrentDC());
-       _extensions_str.append(ARBextensions);
-  }
-
-  if (wglGetExtensionsStringEXT!=NULL) {
-      // usually this will be the same as ARB extensions, but whatever
-      _extensions_str += " ";
-      const char *EXTextensions = wglGetExtensionsStringEXT();
-      _extensions_str.append(EXTextensions);
-  }
-
-  if (wgldisplay_cat.is_spam())
-     wgldisplay_cat.spam() << "GL extensions: " << _extensions_str << endl;
-
-  if(gl_swapbuffer_framelock) {
-     // utilize HW-assisted framelocking if available (3dLabs ext)
-     WGLENABLEFRAMELOCKI3DFUNCPTR wglEnableFrameLock = (WGLENABLEFRAMELOCKI3DFUNCPTR) wglGetProcAddress("wglEnableFrameLockI3D");
-
-     if(wglEnableFrameLock==NULL) {
-         wgldisplay_cat.fatal() << "wglEnableFrameLockI3D not found in OpenGL ICD, cannot implement gl-swapbuffer-framelock!\n";
-         exit(1);
-     } else {
-         BOOL result = wglEnableFrameLock();
-         if(!result) {
-             wgldisplay_cat.fatal() << "wglEnableFrameLockI3D failed, error=" << GetLastError() << endl;
-             exit(1);
-         }
-     }
-
-     if(wgldisplay_cat.is_debug()) {
-         WGLQUERYFRAMELOCKMASTERI3DFUNCPTR wglQueryFrameLockMasterI3D = (WGLQUERYFRAMELOCKMASTERI3DFUNCPTR) wglGetProcAddress("wglQueryFrameLockMasterI3D");
-         BOOL bIsMaster;
-         if((wglQueryFrameLockMasterI3D!=NULL) && wglQueryFrameLockMasterI3D(&bIsMaster))
-             wgldisplay_cat.debug() << "SwapBuffer Frame-locking Enabled, HW wired as framelock " << (bIsMaster ? "Master" : "Slave") << endl;
-     }
-
-     gl_sync_video=true;       // you want gl_sync_video if you want framelock, right?
-  }
-
-  if (gl_sync_video) {
-      // set swapbuffers to swap no more than once per monitor refresh
-      // note sometimes the ICD advertises this ext, but it still doesn't seem to work
-      if (_extensions_str.find("WGL_EXT_swap_control")!=_extensions_str.npos) {
-           PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
-           wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
-           if (wglSwapIntervalEXT!=NULL)
-               wglSwapIntervalEXT(1);
-
-           if (wgldisplay_cat.is_spam())
-               wgldisplay_cat.spam() << "setting swapbuffer interval to 1/refresh\n";
-      }
-  }
-
-  gl_supports_bgr = (_extensions_str.find("GL_EXT_bgra")!=_extensions_str.npos);
-
-  // hard to imagine a windows-based driver that doesnt support this ordering
-  if(!gl_supports_bgr)
-     wgldisplay_cat.info() << "Note GL_EXT_bgra not supported, textures must be swizzled!\n";
-
-  if (gl_show_fps_meter) {
-
-      _start_time = timeGetTime();
-      _current_fps = 0.0;
-      _start_frame_count = _cur_frame_count = 0;
-
-     // 128 enough to handle all the ascii chars
-     // this creates a display list for each char.  displist numbering starts
-     // at FONT_BITMAP_OGLDISPLAYLISTNUM.  Might want to optimize just to save
-     // mem by just allocing bitmaps for chars we need (0-9 fps,SPC)
-     wglUseFontBitmaps(_hdc, 0, 128, FONT_BITMAP_OGLDISPLAYLISTNUM);
-  }
-
-  if (wgldisplay_cat.is_info()) {
-     const char *vendStr=(const char *) glGetString(GL_VENDOR);
-     const char *rendStr=(const char *) glGetString(GL_RENDERER);
-     const char *versStr=(const char *) glGetString(GL_VERSION);
-
-     // Note:  glGetString will never return a valid value until you do wglMakeCurrent
-
-     if (vendStr!=NULL) {
-         wgldisplay_cat.info()
-              << "GL_VENDOR: " <<  vendStr
-              << "  GL_RENDERER: " << ((rendStr==NULL) ? "" : rendStr)
-              << "  GL_VERSION: " <<  ((versStr==NULL) ? "" : versStr) << endl;
-      } else {
-         wgldisplay_cat.info() << "glGetString(GL_VENDOR) returns NULL!\n";
-      }
-  }
-}
-
-void wglGraphicsWindow::
-check_for_color_cursor_support() {
-    // card support for non-black/white GDI cursors varies greatly.  if the cursor is not supported,
-    // it is rendered in software by GDI, which causes a flickering effect (because it's not synced
-    // with flip?).  GDI transparently masks what's happening so there is no easy way for app to detect
-    // if HW cursor support exists.  alternatives are to tie cursor motion to frame rate using DDraw blts
-    // or overlays, or to have separate thread draw cursor (sync issues?).  instead we do mono cursor
-    // unless card is known to support 256 color cursors
-
-    string windows_color_cursor_filename = get_color_cursor_filename_2().to_os_specific();
-    if (windows_color_cursor_filename.empty())
-       return;
-
-    bool bSupportsColorCursor=false;
-    const GLubyte *vendorname=glGetString(GL_VENDOR);
-    if (vendorname==NULL) {
-        return;
-    }
-    char vendorstr[500];
-    strncpy(vendorstr,(const char *)vendorname,sizeof(vendorstr));
-    _strlwr(vendorstr);
-    if (strstr(vendorstr,"nvidia")!=NULL)
-        bSupportsColorCursor=true;
-
-    // for now, just assume only nvidia supports color. need to add more checks for other cards
-    // like in DX l8r.
-
-    if (bSupportsColorCursor) {
-        // Note: LoadImage seems to cause win2k internal heap corruption (outputdbgstr warnings)
-        // if icon is more than 8bpp (because it was 'mapping' 16bpp colors to the device?)
-
-        DWORD load_flags = LR_LOADFROMFILE;
-
-        if (_props._fullscreen) {
-          // I think cursors should use LR_CREATEDIBSECTION since they should not be mapped to the device palette (in the case of 256-color cursors)
-          // since they are not going to be used on the desktop
-          load_flags |= LR_CREATEDIBSECTION;
-
-          // note: this is still doing weird stuff when it loads 8bpp colors, even with LR_CREATEDIBSECTION
-          // there is still a bug here  BUGBUG
-        }
-
-        // loads a .cur fmt file
-        HCURSOR hNewMouseCursor = (HCURSOR) LoadImage(NULL, windows_color_cursor_filename.c_str(), IMAGE_CURSOR, 0, 0, load_flags);
-
-        if (hNewMouseCursor==NULL) {
-            wgldisplay_cat.warning() << "windows color cursor filename '" << windows_color_cursor_filename << "' not found!!\n";
-            return;
-        }
-
-        SetClassLongPtr(_mwindow, GCLP_HCURSOR, (LONG_PTR) hNewMouseCursor);
-        SetCursor(hNewMouseCursor);
-
-        if (_bLoadedCustomCursor)
-           DestroyCursor(_hMouseCursor);
-        _hMouseCursor = hNewMouseCursor;
-
-        if (wgldisplay_cat.is_spam())
-            wgldisplay_cat.spam() << "loaded color cursor\n";
-    }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Constructor
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-wglGraphicsWindow::
-wglGraphicsWindow(GraphicsPipe* pipe) : GraphicsWindow(pipe) {
-  config();
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: Constructor
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-wglGraphicsWindow::
-wglGraphicsWindow(GraphicsPipe* pipe, const
-    GraphicsWindow::Properties& props) : GraphicsWindow(pipe, props) {
-  config();
-}
-
-#ifdef _DEBUG
-void PrintPFD(PIXELFORMATDESCRIPTOR *pfd,char *msg) {
-
-  OGLDriverType drvtype;
-  if ((pfd->dwFlags & PFD_GENERIC_ACCELERATED) && (pfd->dwFlags & PFD_GENERIC_FORMAT))
-      drvtype=MCD;
-   else if (!(pfd->dwFlags & PFD_GENERIC_ACCELERATED) && !(pfd->dwFlags & PFD_GENERIC_FORMAT))
-      drvtype=ICD;
-   else {
-     drvtype=Software;
-   }
-
-#define PrintFlag(FLG) ((pfd->dwFlags &  PFD_##FLG) ? (" PFD_" #FLG "|") : "")
-  wgldisplay_cat.spam() << "================================\n";
-
-  wgldisplay_cat.spam() << msg << ", " << OGLDrvStrings[drvtype] << " driver\n"
-                         << "PFD flags: 0x" << (void*)pfd->dwFlags << " (" <<
-                        PrintFlag(GENERIC_ACCELERATED) <<
-                        PrintFlag(GENERIC_FORMAT) <<
-                        PrintFlag(DOUBLEBUFFER) <<
-                        PrintFlag(SUPPORT_OPENGL) <<
-                        PrintFlag(SUPPORT_GDI) <<
-                        PrintFlag(STEREO) <<
-                        PrintFlag(DRAW_TO_WINDOW) <<
-                        PrintFlag(DRAW_TO_BITMAP) <<
-                        PrintFlag(SWAP_EXCHANGE) <<
-                        PrintFlag(SWAP_COPY) <<
-                        PrintFlag(SWAP_LAYER_BUFFERS) <<
-                        PrintFlag(NEED_PALETTE) <<
-                        PrintFlag(NEED_SYSTEM_PALETTE) <<
-                        PrintFlag(SUPPORT_DIRECTDRAW) << ")\n"
-                         << "PFD iPixelType: " << ((pfd->iPixelType==PFD_TYPE_RGBA) ? "PFD_TYPE_RGBA":"PFD_TYPE_COLORINDEX") << endl
-                         << "PFD cColorBits: " << (DWORD)pfd->cColorBits << "  R: " << (DWORD)pfd->cRedBits <<" G: " << (DWORD)pfd->cGreenBits <<" B: " << (DWORD)pfd->cBlueBits << endl
-                         << "PFD cAlphaBits: " << (DWORD)pfd->cAlphaBits << "  DepthBits: " << (DWORD)pfd->cDepthBits <<" StencilBits: " << (DWORD)pfd->cStencilBits <<" AccumBits: " << (DWORD)pfd->cAccumBits << endl;
-}
-#endif
-
-// this helper routine looks for either HW-only or SW-only format, but not both
-// returns number of pixelformat
-int wglGraphicsWindow::find_pixfmtnum(bool bLookforHW) {
-    int mask = _props._mask;
-    int want_depth_bits = _props._want_depth_bits;
-    int want_color_bits = _props._want_color_bits;
-    OGLDriverType drvtype;
-
-    if (mask & W_MULTISAMPLE) {
-      wgldisplay_cat.error() << "config() - multisample not supported"<< endl;
-      mask &= ~W_MULTISAMPLE;
-    }
-
-    if(wgldisplay_cat.is_debug())
-       wgldisplay_cat.debug() << "mask =0x" << (void*) mask << endl;
-
-    PIXELFORMATDESCRIPTOR pfd;
-    ZeroMemory(&pfd,sizeof(PIXELFORMATDESCRIPTOR));
-    pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);
-    pfd.nVersion=1;
-
-  //  if (_props._fullscreen) {
-  //  do anything different for fullscrn?
-
-    // just use the pixfmt of the current desktop
-
-    int MaxPixFmtNum=DescribePixelFormat(_hdc, 1, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
-    int cur_bpp=GetDeviceCaps(_hdc,BITSPIXEL);
-    int pfnum;
-
-    for(pfnum=1;pfnum<=MaxPixFmtNum;pfnum++) {
-        DescribePixelFormat(_hdc, pfnum, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
-
-      // official, nvidia sanctioned way.  should be equiv to my algorithm
-      if ((pfd.dwFlags & PFD_GENERIC_FORMAT) != 0)
-          drvtype = Software;
-      else if (pfd.dwFlags & PFD_GENERIC_ACCELERATED)
-          drvtype = MCD;
-      else drvtype = ICD;
-
-  #if MY_OLD_ALGORITHM
-        if ((pfd.dwFlags & PFD_GENERIC_ACCELERATED) && (pfd.dwFlags & PFD_GENERIC_FORMAT))
-            drvtype=MCD;
-         else if (!(pfd.dwFlags & PFD_GENERIC_ACCELERATED) && !(pfd.dwFlags & PFD_GENERIC_FORMAT))
-            drvtype=ICD;
-         else {
-           drvtype=Software;
-           continue;  // skipping all SW fmts
-         }
-  #endif
-
-         // skip driver types we are not looking for
-         if(bLookforHW) {
-             if(drvtype==Software)
-                continue;
-         } else {
-             if(drvtype!=Software)
-                 continue;
-         }
-
-        if ((pfd.iPixelType == PFD_TYPE_COLORINDEX) && !(mask & W_INDEX))
-            continue;
-
-         DWORD dwReqFlags=(PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW);
-
-         if (wgldisplay_cat.is_debug()) {
-           wgldisplay_cat->debug() << "----------------" << endl;
-
-           if (mask & W_ALPHA)
-             wgldisplay_cat->debug() << "want alpha, pfd says '"
-                         << (int)(pfd.cAlphaBits) << "'" << endl;
-           if (mask & W_DEPTH)
-             wgldisplay_cat->debug() << "want depth, pfd says '"
-                         << (int)(pfd.cDepthBits) << "'" << endl;
-           if (mask & W_STENCIL)
-             wgldisplay_cat->debug() << "want stencil, pfd says '"
-                         << (int)(pfd.cStencilBits) << "'" << endl;
-           wgldisplay_cat->debug() << "final flag check "
-                       << (int)(pfd.dwFlags & dwReqFlags) << " =? "
-                       << (int)dwReqFlags << endl;
-           wgldisplay_cat->debug() << "pfd bits = " << (int)(pfd.cColorBits)
-                       << endl;
-           wgldisplay_cat->debug() << "cur_bpp = " << cur_bpp << endl;
-         }
-
-         if (mask & W_DOUBLE)
-             dwReqFlags|= PFD_DOUBLEBUFFER;
-         if ((mask & W_ALPHA) && (pfd.cAlphaBits==0))
-             continue;
-         if ((mask & W_DEPTH) && (pfd.cDepthBits==0))
-             continue;
-         if ((mask & W_STENCIL) && (pfd.cStencilBits==0))
-             continue;
-
-         if ((pfd.dwFlags & dwReqFlags)!=dwReqFlags)
-             continue;
-
-         // now we ignore the specified want_color_bits for windowed mode
-         // instead we use the current screen depth
-
-         if ((pfd.cColorBits!=cur_bpp) && (!((cur_bpp==16) && (pfd.cColorBits==15)))
-                                      && (!((cur_bpp==32) && (pfd.cColorBits==24))))
-             continue;
-         // we've passed all the tests, go ahead and pick this fmt
-         // note: could go continue looping looking for more alpha bits or more depth bits
-         // so this would pick 16bpp depth buffer, probably not 24bpp
-
-         break;
-    }
-
-    if(pfnum>MaxPixFmtNum)
-        pfnum=0;
-
-    return pfnum;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: choose visual
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-int wglGraphicsWindow::choose_visual(void) {
-  int pfnum;
-  bool bUsingSoftware=false;
-
-  if(wgl_force_sw_renderer) {
-      pfnum=find_pixfmtnum(false);
-
-      if(pfnum==0) {
-          wgldisplay_cat.error() << "ERROR: couldn't find compatible software-renderer OpenGL pixfmt, check your window properties!\n";
-          exit(1);
-      }
-      bUsingSoftware=true;
-  } else {
-      pfnum=find_pixfmtnum(true);
-      if(pfnum==0) {
-          if(wgl_allow_sw_renderer) {
-              pfnum=find_pixfmtnum(false);
-              if(pfnum==0) {
-                  wgldisplay_cat.error() << "ERROR: couldn't find HW or Software OpenGL pixfmt appropriate for this desktop!!\n";
-              }
-          } else {
-              wgldisplay_cat.error() << "ERROR: couldn't find HW-accelerated OpenGL pixfmt appropriate for this desktop!!\n";
-          }
-
-          if(pfnum==0) {
-            wgldisplay_cat.error()
-              << "make sure OpenGL driver is installed, and try reducing the screen size, reducing the\n"
-              << "desktop screen pixeldepth to 16bpp,and check your panda window properties\n";
-            exit(1);
-          }
-          bUsingSoftware=true;
-      }
-  }
-
-  if(wgl_allow_sw_renderer && bUsingSoftware) {
-      wgldisplay_cat.info() << "Couldn't find compatible OGL HW pixelformat, using software rendering...\n";
-  }
-
-  DescribePixelFormat(_hdc, pfnum, sizeof(PIXELFORMATDESCRIPTOR), &_pixelformat);
-
-  #ifdef _DEBUG
-    char msg[200];
-    sprintf(msg,"Selected GL PixelFormat is #%d",pfnum);
-    PrintPFD(&_pixelformat,msg);
-  #endif
-
-  return pfnum;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: setup_colormap
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::setup_colormap() {
-
-  PIXELFORMATDESCRIPTOR pfd;
-  LOGPALETTE *logical;
-  int n;
-
-  /* grab the pixel format */
-  memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
-  DescribePixelFormat(_hdc, GetPixelFormat(_hdc),
-                      sizeof(PIXELFORMATDESCRIPTOR), &pfd);
-
-  if (!(pfd.dwFlags & PFD_NEED_PALETTE ||
-      pfd.iPixelType == PFD_TYPE_COLORINDEX))
-    return;
-
-  n = 1 << pfd.cColorBits;
-
-  /* allocate a bunch of memory for the logical palette (assume 256
-     colors in a Win32 palette */
-  logical = (LOGPALETTE*)malloc(sizeof(LOGPALETTE) +
-                                sizeof(PALETTEENTRY) * n);
-  memset(logical, 0, sizeof(LOGPALETTE) + sizeof(PALETTEENTRY) * n);
-
-  /* set the entries in the logical palette */
-  logical->palVersion = 0x300;
-  logical->palNumEntries = n;
-
-  /* start with a copy of the current system palette */
-  GetSystemPaletteEntries(_hdc, 0, 256, &logical->palPalEntry[0]);
-
-  if (pfd.iPixelType == PFD_TYPE_RGBA) {
-    int redMask = (1 << pfd.cRedBits) - 1;
-    int greenMask = (1 << pfd.cGreenBits) - 1;
-    int blueMask = (1 << pfd.cBlueBits) - 1;
-    int i;
-
-    /* fill in an RGBA color palette */
-    for (i = 0; i < n; ++i) {
-      logical->palPalEntry[i].peRed =
-        (((i >> pfd.cRedShift)   & redMask)   * 255) / redMask;
-      logical->palPalEntry[i].peGreen =
-        (((i >> pfd.cGreenShift) & greenMask) * 255) / greenMask;
-        logical->palPalEntry[i].peBlue =
-        (((i >> pfd.cBlueShift)  & blueMask)  * 255) / blueMask;
-      logical->palPalEntry[i].peFlags = 0;
-    }
-  }
-
-  _colormap = CreatePalette(logical);
-  free(logical);
-
-  SelectPalette(_hdc, _colormap, FALSE);
-  RealizePalette(_hdc);
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: end_frame
-//       Access:
-//  Description: Swaps the front and back buffers.
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::end_frame() {
-  if (gl_show_fps_meter) {
-    DO_PSTATS_STUFF(PStatTimer timer(_show_fps_pcollector);)
-    DWORD now = timeGetTime();  // this is win32 fn
-
-    float time_delta = (now - _start_time) * 0.001f;
-
-    if (time_delta > gl_fps_meter_update_interval) {
-      // didnt use global clock object, it wasnt working properly when
-      // I tried, its probably slower due to cache faults, and I can
-      // easily track all the info I need in dxgsg
-      DWORD num_frames = _cur_frame_count - _start_frame_count;
-
-      _current_fps = num_frames / time_delta;
-      _start_time = now;
-      _start_frame_count = _cur_frame_count;
-    }
-
-    char fps_msg[15];
-    sprintf(fps_msg, "%.02f fps", _current_fps);
-
-    // Note: we cant use simple GDI TextOut calls to draw FPS meter
-    // chars (like DX fps meter) because WGL doesnt support GDI in
-    // double-buffered mode.  Instead we have to use glBitMap display
-    // lists created by wglUseFontBitmaps
-
-    GLfloat saved_color[4];
-    glGetFloatv(GL_CURRENT_COLOR,saved_color);
-    glColor3f(0.0f,1.0f,1.0f);
-
-    GLboolean tex_was_on = glIsEnabled(GL_TEXTURE_2D);
-
-    if (tex_was_on)
-      glDisable(GL_TEXTURE_2D);
-
-    glMatrixMode(GL_MODELVIEW);
-    glPushMatrix();
-    glLoadIdentity();
-    glMatrixMode(GL_PROJECTION);
-    glPushMatrix();
-    glLoadIdentity();
-
-    glOrtho(0.0f,_props._xsize,
-            0.0f,_props._ysize,
-            -1.0f,1.0f);
-
-    // problem to not restore the rasterPos state?
-    glRasterPos2f(_props._xsize-70,_props._ysize-20);  // these seem to be good for default font
-
-    // set up for a string-drawing display list call
-    glListBase(FONT_BITMAP_OGLDISPLAYLISTNUM);
-
-    // draw a string using font display lists.  chars index their
-    // corresponding displist name
-    glCallLists(strlen(fps_msg), GL_UNSIGNED_BYTE, fps_msg);
-
-    // restore original gl state
-    glPopMatrix();
-    glMatrixMode(GL_MODELVIEW);
-    glPopMatrix();
-    glColor4fv(saved_color);
-    if (tex_was_on)
-      glEnable(GL_TEXTURE_2D);
-
-    _cur_frame_count++;  // only used by fps meter right now
-  }
-
-  {
-     DO_PSTATS_STUFF(PStatTimer timer(_swap_pcollector);)
-     if (_is_synced)
-        glFinish();
-     else SwapBuffers(_hdc);
-  }
-  GraphicsWindow::end_frame();
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: swap
-//       Access:
-//  Description: Swaps the front and back buffers explicitly.
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::swap() {
-  if (_is_synced)
-    SwapBuffers(_hdc);
-}
-
-bool wglGraphicsWindow::resize(unsigned int xsize,unsigned int ysize) {
-    if (!_props._fullscreen) {
-        // resizing windowed mode is easy
-        SetWindowPos(_mwindow, NULL, 0,0, xsize,ysize, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSENDCHANGING);
-    } else {
-      DWORD dwWidth =  xsize;
-      DWORD dwHeight = ysize;
-
-      HWND hDesktopWindow = GetDesktopWindow();
-      HDC scrnDC=GetDC(hDesktopWindow);
-      DWORD dwFullScreenBitDepth=GetDeviceCaps(scrnDC,BITSPIXEL);
-      ReleaseDC(hDesktopWindow,scrnDC);
-
-      // resize will always leave screen bitdepth unchanged
-
-      // allowing resizing of lowvidmem cards to > 640x480.  why?  I'll assume
-      // check was already done by caller, so he knows what he wants
-
-      DEVMODE dm;
-      if (!find_acceptable_display_mode(dwWidth,dwHeight,dwFullScreenBitDepth,dm)) {
-          wgldisplay_cat.fatal() << "window resize(" << xsize << "," << ysize << ") failed, no compatible fullscreen display mode found!\n";
-          return false;
-      }
-
-      // this causes WM_SIZE msg to be produced
-      SetWindowPos(_mwindow, NULL, 0,0, xsize, ysize, SWP_NOZORDER | SWP_NOMOVE | SWP_NOSENDCHANGING);
-
-      int chg_result = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
-
-      if (chg_result!=DISP_CHANGE_SUCCESSFUL) {
-            wgldisplay_cat.fatal() << "resize ChangeDisplaySettings failed (error code: " << chg_result <<") for specified res (" << dwWidth << " X " << dwHeight << " X " << dwFullScreenBitDepth <<"), " << dm.dmDisplayFrequency  << "Hz\n";
-            exit(1);
-      }
-
-      // this assertion could be violated if we eventually allow dynamic fullscrn/windowed mode switching
-      assert(_pCurrent_display_settings!=NULL);
-      memcpy(_pCurrent_display_settings,&dm,sizeof(DEVMODE));
-    }
-    return true;
-}
-
-unsigned int wglGraphicsWindow::
-verify_window_sizes(unsigned int numsizes,unsigned int *dimen) {
-  // see if window sizes are supported (i.e. in fullscrn mode)
-  // dimen is an array containing contiguous x,y pairs specifying
-  // possible display sizes, it is numsizes*2 long.  fn will zero
-  // out any invalid x,y size pairs.  return value is number of valid
-  // sizes that were found.
-  //
-  // note: it might be better to implement some sort of query
-  //       interface that returns an array of supported sizes,
-  //       but this way is somewhat simpler and will do the job
-  //       on most cards, assuming they handle the std sizes the app
-  //       knows about.
-
-  if (!_props._fullscreen || (numsizes==0)) {
-      return numsizes;
-  }
-
-  assert(dimen!=NULL);
-
-  HWND hDesktopWindow = GetDesktopWindow();
-  HDC scrnDC=GetDC(hDesktopWindow);
-  DWORD dwFullScreenBitDepth=GetDeviceCaps(scrnDC,BITSPIXEL);
-  ReleaseDC(hDesktopWindow,scrnDC);
-
-  // gonna do an n^2 loop alg for simplicity.  if speed is necessary,
-  // could do linear time with some kind of STL hash container I guess
-
-  DEVMODE dm;
-  uint modenum=0;
-  uint goodmodes=0;
-  unsigned int *cur_dim_pair=dimen;
-  for(;modenum<numsizes;modenum++,cur_dim_pair+=2) {
-      bool bIsGoodmode;
-      DWORD dwWidth=cur_dim_pair[0];
-      DWORD dwHeight=cur_dim_pair[1];
-
-      if ((dwWidth==0)||(dwHeight==0)) {
-          bIsGoodmode=false;
-      } else {
-          if (_bIsLowVidMemCard) {
-              bIsGoodmode=((float)(dwWidth*(float)dwHeight)<=(float)(640*480));
-          } else {
-              bIsGoodmode = find_acceptable_display_mode(dwWidth,dwHeight,dwFullScreenBitDepth,dm);
-          }
-      }
-
-      if (bIsGoodmode) {
-         goodmodes++;
-      } else {
-         // zero out the bad mode
-         cur_dim_pair[0]=0;
-         cur_dim_pair[1]=0;
-      }
-  }
-
-  return goodmodes;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: handle_reshape
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::handle_reshape() {
-      RECT view_rect;
-      GetClientRect(_mwindow, &view_rect);
-      ClientToScreen(_mwindow, (POINT*)&view_rect.left);   // translates top,left pnt
-      ClientToScreen(_mwindow, (POINT*)&view_rect.right);  // translates right,bottom pnt
-
-      // change _props xsize,ysize
-      resized((view_rect.right - view_rect.left),(view_rect.bottom - view_rect.top));
-
-      _props._xorg = view_rect.left;  // _props origin should reflect upper left of view rectangle
-      _props._yorg = view_rect.top;
-
-      if (wgldisplay_cat.is_spam()) {
-          wgldisplay_cat.spam() << "reshape to origin: (" << _props._xorg << "," << _props._yorg << "), size: (" << _props._xsize << "," << _props._ysize << ")\n";
-      }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: handle_mouse_motion
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::handle_mouse_motion(int x, int y) {
-  if (!_input_devices.empty()) {
-    _input_devices[0].set_pointer_in_window(x, y);
-  }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: handle_mouse_exit
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::handle_mouse_exit(void) {
-    // note: 'mouse_motion' is considered the 'entry' event
-    if (!_input_devices.empty()) {
-      _input_devices[0].set_pointer_out_of_window();
-    }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: handle_keypress
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::
-handle_keypress(ButtonHandle key, int x, int y) {
-  if (!_input_devices.empty()) {
-    _input_devices[0].set_pointer_in_window(x, y);
-    if (key != ButtonHandle::none()) {
-      _input_devices[0].button_down(key);
-    }
-  }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: handle_keyrelease
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::
-handle_keyrelease(ButtonHandle key) {
-  if (key != ButtonHandle::none()) {
-    if (!_input_devices.empty()) {
-      _input_devices[0].button_up(key);
-    }
-  }
-}
-
-void INLINE process_1_event() {
-  MSG msg;
-
-  if (!GetMessage(&msg, NULL, 0, 0)) {
-      // WM_QUIT received
-      DestroyAllWindows(false);
-      exit(msg.wParam);  // this will invoke AtExitFn
-  }
-
-  // Translate virtual key messages
-  TranslateMessage(&msg);
-  // Call window_proc
-  DispatchMessage(&msg);
-}
-
-void INLINE wglGraphicsWindow::process_events() {
-  if (!_window_active) {
-      // Get 1 msg at a time until no more are left and we block and sleep,
-      // or message changes _return_control_to_app or !_window_active status
-
-      while(!_window_active && (!_return_control_to_app)) {
-          process_1_event();
-      }
-      _return_control_to_app = false;
-
-  } else {
-      MSG msg;
-
-      // handle all msgs on queue in a row
-      while(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
-          process_1_event();
-      }
-  }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: make_current
-//       Access: Public
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::make_current() {
-  if ((_hdc==NULL)||(_context==NULL)||(!_window_active)) {
-      return;  // we're only allow unmake_current() to set this to NULL
-  }
-
-  DO_PSTATS_STUFF(PStatTimer timer(_make_current_pcollector);)
-  HGLRC current_context = wglGetCurrentContext();
-  HDC current_dc = wglGetCurrentDC();
-
-  if ((current_context != _context) || (current_dc != _hdc)) {
-    if (!wglMakeCurrent(_hdc, _context)) {
-        PrintErrorMessage(LAST_ERROR);
-    }
-  }
-
-  report_errors();
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: unmake_current
-//       Access: Public
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::unmake_current() {
-  report_errors();
-
-  if (!wglMakeCurrent(NULL, NULL)) {
-      PrintErrorMessage(LAST_ERROR);
-  }
-}
-
-int wglGraphicsWindow::get_depth_bitwidth() {
-    return _pixelformat.cDepthBits;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: wglGraphicsWindow::get_gsg_type
-//       Access: Public, Virtual
-//  Description: Returns the TypeHandle of the kind of GSG preferred
-//               by this kind of window.
-////////////////////////////////////////////////////////////////////
-TypeHandle wglGraphicsWindow::
-get_gsg_type() const {
-  return GLGraphicsStateGuardian::get_class_type();
-}
-
-GraphicsWindow *wglGraphicsWindow::
-make_wglGraphicsWindow(const FactoryParams &params) {
-  GraphicsWindow::WindowPipe *pipe_param;
-  if (!get_param_into(pipe_param, params)) {
-    wgldisplay_cat.error()
-      << "No pipe specified for window creation!" << endl;
-    return NULL;
-  }
-
-  GraphicsPipe *pipe = pipe_param->get_pipe();
-
-  GraphicsWindow::WindowProps *props_param;
-  if (!get_param_into(props_param, params)) {
-    return new wglGraphicsWindow(pipe);
-  } else {
-    return new wglGraphicsWindow(pipe, props_param->get_properties());
-  }
-}
-
-TypeHandle wglGraphicsWindow::get_class_type() {
-  return _type_handle;
-}
-
-void wglGraphicsWindow::init_type() {
-  GraphicsWindow::init_type();
-  register_type(_type_handle, "wglGraphicsWindow",
-        GraphicsWindow::get_class_type());
-}
-
-TypeHandle wglGraphicsWindow::get_type() const {
-  return get_class_type();
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: static_window_proc
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-LONG WINAPI static_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
-   HWND_PANDAWIN_MAP::iterator pwin;
-   pwin=hwnd_pandawin_map.find(hwnd);
-
-   if (pwin!=hwnd_pandawin_map.end()) {
-      wglGraphicsWindow *wglwinptr=(*pwin).second;
-      return wglwinptr->window_proc(hwnd, msg, wparam, lparam);
-   } else if (global_wglwinptr!=NULL){
-       // this stuff should only be used during CreateWindow()
-       return global_wglwinptr->window_proc(hwnd, msg, wparam, lparam);
-   } else {
-       // should never need this??  (maybe at shutdwn?)
-       return DefWindowProc(hwnd, msg, wparam, lparam);
-   }
-}
-
-void wglGraphicsWindow::deactivate_window() {
-    // current policy is to suspend minimized or deactivated fullscreen windows, but leave
-    // regular windows running normally
-
-   if ((!_props._fullscreen) || _exiting_window || !_window_active || _active_minimized_fullscreen) {
-       #ifdef _DEBUG
-          if (wgldisplay_cat.is_spam())
-            wgldisplay_cat.spam()  << "deactivate_window called, but ignored in current mode"  << endl;
-       #endif
-     return;
-   }
-
-   throw_event("PandaPaused"); // right now this is used to signal python event handler to disable audio
-
-   if (!bResponsive_minimized_fullscreen_window) {
-       if (wgldisplay_cat.is_spam())
-           wgldisplay_cat.spam() << "WGL window deactivated, releasing gl context and waiting...\n";
-
-      _window_active = false;
-      unmake_current();
-   } else {
-       _active_minimized_fullscreen = true;
-       assert(_props._fullscreen);
-
-       if (wgldisplay_cat.is_spam())
-           wgldisplay_cat.spam() << "WGL window minimized from fullscreen mode, remaining active...\n";
-   }
-
-   // make sure window is minimized
-
-   WINDOWPLACEMENT wndpl;
-   wndpl.length=sizeof(WINDOWPLACEMENT);
-
-   if (!GetWindowPlacement(_mwindow,&wndpl)) {
-       wgldisplay_cat.error() << "GetWindowPlacement failed!\n";
-       return;
-   }
-
-   if ((wndpl.showCmd!=SW_MINIMIZE)&&(wndpl.showCmd!=SW_SHOWMINIMIZED)) {
-       ShowWindow(_mwindow, SW_MINIMIZE);
-   }
-
-   // revert to default display mode
-   ChangeDisplaySettings(NULL,0x0);
-
-   if (!bResponsive_minimized_fullscreen_window) {
-       _PandaPausedTimer = SetTimer(_mwindow,PAUSED_TIMER_ID,1500,NULL);
-       if (_PandaPausedTimer!=PAUSED_TIMER_ID) {
-           wgldisplay_cat.error() << "Error in SetTimer!\n";
-       }
-   }
-
-   if (_props._fullscreen) {
-      throw_event("PandaRestarted");  // right now this is used to signal python event handler to re-enable audio
-   }
-}
-
-void wglGraphicsWindow::reactivate_window() {
-    if (!_window_active) {
-        if (wgldisplay_cat.is_spam())
-            wgldisplay_cat.spam() << "WGL window re-activated...\n";
-
-        _window_active = true;
-
-        if (_PandaPausedTimer!=NULL) {
-            KillTimer(_mwindow,_PandaPausedTimer);
-            _PandaPausedTimer = NULL;
-        }
-
-        // move window to top of zorder,
-        SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER);
-
-        ChangeDisplaySettings(_pCurrent_display_settings,CDS_FULLSCREEN);
-
-        GdiFlush();
-        make_current();
-    } else if (_active_minimized_fullscreen) {
-        if (wgldisplay_cat.is_spam())
-            wgldisplay_cat.spam() << "redisplaying minimized fullscrn active WGL window...\n";
-
-        // move window to top of zorder,
-        SetWindowPos(_mwindow, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSENDCHANGING | SWP_NOSIZE | SWP_NOOWNERZORDER);
-
-        ChangeDisplaySettings(_pCurrent_display_settings,CDS_FULLSCREEN);
-
-        GdiFlush();
-        make_current();
-        _active_minimized_fullscreen = false;
-    }
-}
-
-// Note: could use _TrackMouseEvent in comctrl32.dll (part of IE 3.0+) which emulates
-// TrackMouseEvent on w95, but that requires another 500K of memory to hold that DLL,
-// which is lame just to support w95, which probably has other issues anyway
-INLINE void wglGraphicsWindow::
-track_mouse_leaving(HWND hwnd) {
-  if(_pfnTrackMouseEvent==NULL)
-      return;
-
-  TRACKMOUSEEVENT tme = {sizeof(TRACKMOUSEEVENT),TME_LEAVE,hwnd,0};
-  BOOL bSucceeded = _pfnTrackMouseEvent(&tme);  // tell win32 to post WM_MOUSELEAVE msgs
-
-  if((!bSucceeded) && wgldisplay_cat.is_debug())
-     wgldisplay_cat.debug() << "TrackMouseEvent failed!, LastError=" << GetLastError() << endl;
-
-  _tracking_mouse_leaving=true;
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: window_proc
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-LONG WINAPI wglGraphicsWindow::
-window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
-  int button = -1;
-  int x, y;
-
-  switch (msg) {
-
-    case WM_MOUSEMOVE: {
-        // Win32 doesn't return the same numbers as X does when the mouse
-        // goes beyond the upper or left side of the window
-        #define SET_MOUSE_COORD(iVal,VAL) { \
-                iVal = VAL;                   \
-                if(iVal & 0x8000)             \
-                  iVal -= 0x10000;            \
-        }
-
-        if(!_tracking_mouse_leaving) {
-            // need to re-call TrackMouseEvent every time mouse re-enters window
-            track_mouse_leaving(hwnd);
-        }
-
-        SET_MOUSE_COORD(x,LOWORD(lparam));
-        SET_MOUSE_COORD(y,HIWORD(lparam));
-
-        handle_mouse_motion(x, y);
-
-        break;
-    }
-
-    // if cursor is invisible, make it visible when moving in the window bars,etc
-    case WM_NCMOUSEMOVE: {
-      if(!_props._bCursorIsVisible) {
-          if(!_cursor_in_windowclientarea) {
-             // wgldisplay_cat.error() << "NCMOUSEMOVE show=true\n";
-              ShowCursor(true);
-              _cursor_in_windowclientarea=true;
-          }
-      }
-      break;
-    }
-
-    case WM_NCMOUSELEAVE: {
-        if(!_props._bCursorIsVisible) {
-            // wgldisplay_cat.error() << "NCMOUSELEAVE show=false\n";
-            ShowCursor(false);
-            _cursor_in_windowclientarea=false;
-        }
-        break;
-    }
-
-    case WM_MOUSELEAVE: {
-       _tracking_mouse_leaving=false;
-       handle_mouse_exit();
-       break;
-    }
-
-    case WM_CREATE: {
-      track_mouse_leaving(hwnd);
-
-      _cursor_in_windowclientarea=false;
-      if(!_props._bCursorIsVisible)
-          ShowCursor(false);
-      break;
-    }
-
-    case WM_CLOSE:
-          close_window();
-
-          // BUGBUG:  right now there is no way to tell the panda app the graphics window is invalid or
-          //          has been closed by the user, to prevent further methods from being called on the window.
-          //          this needs to be added to panda for multiple windows to work.  in the meantime, just
-          //          trigger an exit here if numwindows==0, since that is the expected behavior when all
-          //          windows are closed (should be done by the app though, and it assumes you only make this
-          //          type of panda gfx window)
-
-          if (hwnd_pandawin_map.size()==0) {
-              exit(0);
-          }
-          break;
-
-    case WM_MOVE:
-          // handle all this stuff in EXITSIZEMOVE.  will rendering work during moving?  do we care?
-          //_props._xorg = LOWORD(lparam);
-          //_props._yorg = HIWORD(lparam);
-          break;
-
-
-    case WM_ACTIVATEAPP: {
-            #ifdef _DEBUG
-              wgldisplay_cat.spam()  << "WM_ACTIVATEAPP(" << (bool)(wparam!=0) <<") received\n";
-            #endif
-
-           if (!wparam) {
-               deactivate_window();
-               return 0;
-           }         // dont want to reactivate until window is actually un-minimized (see WM_SIZE)
-           break;
-        }
-
-    case WM_EXITSIZEMOVE:
-            #ifdef _DEBUG
-              wgldisplay_cat.spam()  << "WM_EXITSIZEMOVE received"  << endl;
-            #endif
-
-            reactivate_window();
-            handle_reshape();
-            break;
-
-    case WM_ENTERSIZEMOVE:
-            break;
-
-    case WM_SIZE: {
-                DWORD width,height;
-
-                width = LOWORD(lparam);  height = HIWORD(lparam);
-            #ifdef _DEBUG
-                {
-                    wgldisplay_cat.spam() << "WM_SIZE received with width:" << width << "  height: " << height << " flags: " <<
-                    ((wparam == SIZE_MAXHIDE)? "SIZE_MAXHIDE " : "") << ((wparam == SIZE_MAXSHOW)? "SIZE_MAXSHOW " : "") <<
-                    ((wparam == SIZE_MINIMIZED)? "SIZE_MINIMIZED " : "") << ((wparam == SIZE_RESTORED)? "SIZE_RESTORED " : "") <<
-                    ((wparam == SIZE_MAXIMIZED)? "SIZE_MAXIMIZED " : "") << endl;
-                }
-            #endif
-                if (_mwindow==NULL)
-                    break;
-
-                if ((wparam==SIZE_MAXIMIZED) || (wparam==SIZE_RESTORED)) { // old comment -- added SIZE_RESTORED to handle 3dfx case  (what does this mean?)
-                     reactivate_window();
-
-//                  if ((_props._xsize != width) || (_props._ysize != height))
-                     handle_reshape();
-                }
-                break;
-    }
-
-    case WM_PAINT: {
-          PAINTSTRUCT ps;
-          BeginPaint(hwnd, &ps);
-            // glReadBuffer(GL_BACK);  need to copy current rendering to front buffer, a la wdxdisplay?
-          EndPaint(hwnd, &ps);
-          return 0;
-    }
-
-    case WM_IME_NOTIFY:
-      if (wparam == IMN_SETOPENSTATUS) {
-        HIMC hIMC = ImmGetContext(hwnd);
-        nassertr(hIMC != 0, 0);
-        _ime_open = (ImmGetOpenStatus(hIMC) != 0);
-        if (!_ime_open) {
-          _ime_active = false;  // Sanity enforcement.
-        }
-        ImmReleaseContext(hwnd, hIMC);
-      }
-      break;
-
-    case WM_IME_STARTCOMPOSITION:
-      _ime_active = true;
-      break;
-
-    case WM_IME_ENDCOMPOSITION:
-      _ime_active = false;
-      break;
-
-    case WM_IME_COMPOSITION:
-      if (lparam & GCS_RESULTSTR) {
-        if (!_input_devices.empty()) {
-          HIMC hIMC = ImmGetContext(hwnd);
-          nassertr(hIMC != 0, 0);
-
-          static const int max_ime_result = 128;
-          static char ime_result[max_ime_result];
-
-          if (_ime_composition_w) {
-            // Since ImmGetCompositionStringA() doesn't seem to work
-            // for Win2000 (it always returns question mark
-            // characters), we have to use ImmGetCompositionStringW()
-            // on this OS.  This is actually the easier of the two
-            // functions to use.
-
-            DWORD result_size =
-              ImmGetCompositionStringW(hIMC, GCS_RESULTSTR,
-                                       ime_result, max_ime_result);
-
-            // Add this string into the text buffer of the application.
-
-            // ImmGetCompositionStringW() returns a string, but it's
-            // filled in with wstring data: every two characters defines a
-            // 16-bit unicode char.  The docs aren't clear on the
-            // endianness of this.  I guess it's safe to assume all Win32
-            // machines are little-endian.
-            for (DWORD i = 0; i < result_size; i += 2) {
-              int result =
-                ((int)(unsigned char)ime_result[i + 1] << 8) |
-                (unsigned char)ime_result[i];
-              _input_devices[0].keystroke(result);
-            }
-          } else {
-            // On the other hand, ImmGetCompositionStringW() doesn't
-            // work on Win95 or Win98; for these OS's we must use
-            // ImmGetCompositionStringA().
-            DWORD result_size =
-              ImmGetCompositionStringA(hIMC, GCS_RESULTSTR,
-                                       ime_result, max_ime_result);
-
-            // ImmGetCompositionStringA() returns an encoded ANSI
-            // string, which we now have to map to wide-character
-            // Unicode.
-            static const int max_wide_result = 128;
-            static wchar_t wide_result[max_wide_result];
-
-            int wide_size =
-              MultiByteToWideChar(CP_ACP, 0,
-                                  ime_result, result_size,
-                                  wide_result, max_wide_result);
-            if (wide_size == 0) {
-              PrintErrorMessage(LAST_ERROR);
-            }
-            for (int i = 0; i < wide_size; i++) {
-              _input_devices[0].keystroke(wide_result[i]);
-            }
-          }
-
-          ImmReleaseContext(hwnd, hIMC);
-        }
-        return 0;
-      }
-      break;
-
-    case WM_CHAR:
-      // Ignore WM_CHAR messages if we have the IME open, since
-      // everything will come in through WM_IME_COMPOSITION.  (It's
-      // supposed to come in through WM_CHAR, too, but there seems to
-      // be a bug in Win2000 in that it only sends question mark
-      // characters through here.)
-      if (!_ime_open && !_input_devices.empty()) {
-        _input_devices[0].keystroke(wparam);
-      }
-      break;
-
-    case WM_SYSKEYDOWN: {
-          // Alt and F10 are sent as WM_SYSKEYDOWN instead of WM_KEYDOWN
-          // want to use defwindproc on Alt syskey so std windows cmd Alt-F4 works, etc
-          POINT point;
-          GetCursorPos(&point);
-          ScreenToClient(hwnd, &point);
-          handle_keypress(lookup_key(wparam), point.x, point.y);
-          if (wparam == VK_F10) {
-            //bypass default windproc F10 behavior (it activates the main menu, but we have none)
-            return 0;
-          }
-    }
-    break;
-
-    case WM_SYSCOMMAND:
-      if(wparam==SC_KEYMENU) {
-          // if Alt is released (alone w/o other keys), defwindproc will send
-          // this command, which will 'activate' the title bar menu (we have none)
-          // and give focus to it.  we dont want this to happen, so kill this msg
-          return 0;
-      }
-      break;
-
-    case WM_KEYDOWN: {
-      POINT point;
-
-      GetCursorPos(&point);
-      ScreenToClient(hwnd, &point);
-      handle_keypress(lookup_key(wparam), point.x, point.y);
-
-      // Handle Cntrl-V paste from clipboard.  Is there a better way
-      // to detect this hotkey?
-      if ((wparam=='V') && (GetKeyState(VK_CONTROL) < 0) &&
-          !_input_devices.empty()) {
-        HGLOBAL hglb;
-        char *lptstr;
-
-        if (!IsClipboardFormatAvailable(CF_TEXT))
-          return 0;
-
-        if (!OpenClipboard(NULL))
-          return 0;
-
-        // Maybe we should support CF_UNICODETEXT if it is available
-        // too?
-        hglb = GetClipboardData(CF_TEXT);
-        if (hglb!=NULL) {
-          lptstr = (char *) GlobalLock(hglb);
-          if (lptstr != NULL)  {
-            char *pChar;
-            for(pChar=lptstr;*pChar!=NULL;pChar++) {
-              _input_devices[0].keystroke((uchar)*pChar);
-            }
-            GlobalUnlock(hglb);
-          }
-        }
-        CloseClipboard();
-      }
-      break;
-    }
-
-    case WM_SYSKEYUP:
-    case WM_KEYUP:
-      handle_keyrelease(lookup_key(wparam));
-      break;
-
-    case WM_LBUTTONDOWN:
-      button = 0;
-    case WM_MBUTTONDOWN:
-      if (button < 0)
-        button = 1;
-
-    case WM_RBUTTONDOWN:
-      if (button < 0)
-        button = 2;
-      SetCapture(hwnd);
-      SET_MOUSE_COORD(x,LOWORD(lparam));
-      SET_MOUSE_COORD(y,HIWORD(lparam));
-      handle_keypress(MouseButton::button(button), x, y);
-      break;
-    case WM_LBUTTONUP:
-      button = 0;
-    case WM_MBUTTONUP:
-      if (button < 0)
-          button = 1;
-    case WM_RBUTTONUP:
-      if (button < 0)
-          button = 2;
-      ReleaseCapture();
-      #if 0
-          SET_MOUSE_COORD(x,LOWORD(lparam));
-          SET_MOUSE_COORD(y,HIWORD(lparam));
-      #endif
-      handle_keyrelease(MouseButton::button(button));
-      break;
-
-    case WM_SETFOCUS: {
-            // wgldisplay_cat.info() << "got WM_SETFOCUS\n";
-
-            // make_current();  causes errors when Alt-tabbing?
-
-            POINT point;
-            GetCursorPos(&point);
-            ScreenToClient(hwnd, &point);
-
-            // this is a hack to make sure common modifier keys have proper state
-            // since at focus loss, app may never receive key-up event corresponding to
-            // a key-down. it would be better to know the exact set of ModifierButtons the
-            // user is using, since we may miss some here
-
-            for(int i=0;i<NUM_MODIFIER_KEYS;i++) {
-              if (GetKeyState(hardcoded_modifier_buttons[i]) < 0)
-                handle_keypress(lookup_key(hardcoded_modifier_buttons[i]),point.x,point.y);
-            }
-            return 0;
-        }
-
-    case WM_KILLFOCUS: {
-            for(int i=0;i<NUM_MODIFIER_KEYS;i++) {
-              if (GetKeyState(hardcoded_modifier_buttons[i]) < 0)
-                handle_keyrelease(lookup_key(hardcoded_modifier_buttons[i]));
-            }
-
-            return 0;
-    }
-    break;
-
-    case WM_TIMER:
-      if ((wparam==_PandaPausedTimer) && !_window_active) {
-         //wgldisplay_cat.spam() << "returning control to app\n";
-          _return_control_to_app = true;
-         // throw_event("PandaPaused");
-         // do we still need to do this since I return control to app periodically using timer msgs?
-         // does app need to know to avoid major computation?
-      }
-
-      break;
-  }
-
-  return DefWindowProc(hwnd, msg, wparam, lparam);
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: lookup_key
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-ButtonHandle wglGraphicsWindow::
-lookup_key(WPARAM wparam) const {
-    // First, check for a few buttons that we filter out when the IME
-    // window is open.
-    if (!_ime_active) {
-      switch(wparam) {
-      case VK_BACK: return KeyboardButton::backspace();
-      case VK_DELETE: return KeyboardButton::del();
-      case VK_ESCAPE: return KeyboardButton::escape();
-      case VK_SPACE: return KeyboardButton::space();
-      case VK_UP: return KeyboardButton::up();
-      case VK_DOWN: return KeyboardButton::down();
-      case VK_LEFT: return KeyboardButton::left();
-      case VK_RIGHT: return KeyboardButton::right();
-      }
-    }
-
-    // Now check for the rest of the buttons, including the ones that
-    // we allow through even when the IME window is open.
-    switch(wparam) {
-        case VK_TAB: return KeyboardButton::tab();
-        case VK_PRIOR: return KeyboardButton::page_up();
-        case VK_NEXT: return KeyboardButton::page_down();
-        case VK_HOME: return KeyboardButton::home();
-        case VK_END: return KeyboardButton::end();
-        case VK_F1: return KeyboardButton::f1();
-        case VK_F2: return KeyboardButton::f2();
-        case VK_F3: return KeyboardButton::f3();
-        case VK_F4: return KeyboardButton::f4();
-        case VK_F5: return KeyboardButton::f5();
-        case VK_F6: return KeyboardButton::f6();
-        case VK_F7: return KeyboardButton::f7();
-        case VK_F8: return KeyboardButton::f8();
-        case VK_F9: return KeyboardButton::f9();
-        case VK_F10: return KeyboardButton::f10();
-        case VK_F11: return KeyboardButton::f11();
-        case VK_F12: return KeyboardButton::f12();
-        case VK_INSERT: return KeyboardButton::insert();
-        case VK_CAPITAL: return KeyboardButton::caps_lock();
-        case VK_NUMLOCK: return KeyboardButton::num_lock();
-        case VK_SCROLL: return KeyboardButton::scroll_lock();
-        case VK_SNAPSHOT: return KeyboardButton::print_screen();
-
-        case VK_SHIFT:
-        case VK_LSHIFT:
-        case VK_RSHIFT:
-            return KeyboardButton::shift();
-
-        case VK_CONTROL:
-        case VK_LCONTROL:
-        case VK_RCONTROL:
-            return KeyboardButton::control();
-
-        case VK_MENU:
-        case VK_LMENU:
-        case VK_RMENU:
-            return KeyboardButton::alt();
-
-        default:
-            int key = MapVirtualKey(wparam, 2);
-            if (isascii(key) && key != 0) {
-              // We used to try to remap lowercase to uppercase keys
-              // here based on the state of the shift and/or caps lock
-              // keys.  But that's a mistake, and doesn't allow for
-              // international or user-defined keyboards; let Windows
-              // do that mapping.
-
-              // Nowadays, we make a distinction between a "button"
-              // and a "keystroke".  A button corresponds to a
-              // physical button on the keyboard and has a down and up
-              // event associated.  A keystroke may or may not
-              // correspond to a physical button, but will be some
-              // Unicode character and will not have a corresponding
-              // up event.
-              return KeyboardButton::ascii_key(tolower(key));
-            }
-            break;
-    }
-    return ButtonHandle::none();
-}
-
-#if 0
-// old fns
-
-////////////////////////////////////////////////////////////////////
-//     Function: get_config
-//       Access:
-//  Description:
-////////////////////////////////////////////////////////////////////
-void wglGraphicsWindow::
-get_config(PIXELFORMATDESCRIPTOR *visual, int attrib, int *value) {
-  if (visual == NULL)
-    return;
-
-  switch (attrib) {
-    case GLX_USE_GL:
-      if (visual->dwFlags & (PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW)) {
-    if (visual->iPixelType == PFD_TYPE_COLORINDEX &&
-        visual->cColorBits >= 24) {
-      *value = 0;
-    } else {
-      *value = 1;
-    }
-      } else {
-    *value = 0;
-      }
-      break;
-    case GLX_BUFFER_SIZE:
-      if (visual->iPixelType == PFD_TYPE_RGBA)
-    *value = visual->cColorBits;
-      else
-    *value = 8;
-      break;
-    case GLX_LEVEL:
-      *value = visual->bReserved;
-      break;
-    case GLX_RGBA:
-      *value = visual->iPixelType == PFD_TYPE_RGBA;
-      break;
-    case GLX_DOUBLEBUFFER:
-      *value = visual->dwFlags & PFD_DOUBLEBUFFER;
-      break;
-    case GLX_STEREO:
-      *value = visual->dwFlags & PFD_STEREO;
-      break;
-    case GLX_AUX_BUFFERS:
-      *value = visual->cAuxBuffers;
-      break;
-    case GLX_RED_SIZE:
-      *value = visual->cRedBits;
-      break;
-    case GLX_GREEN_SIZE:
-      *value = visual->cGreenBits;
-      break;
-    case GLX_BLUE_SIZE:
-      *value = visual->cBlueBits;
-      break;
-    case GLX_ALPHA_SIZE:
-      *value = visual->cAlphaBits;
-      break;
-    case GLX_DEPTH_SIZE:
-      *value = visual->cDepthBits;
-      break;
-    case GLX_STENCIL_SIZE:
-      *value = visual->cStencilBits;
-      break;
-    case GLX_ACCUM_RED_SIZE:
-      *value = visual->cAccumRedBits;
-      break;
-    case GLX_ACCUM_GREEN_SIZE:
-      *value = visual->cAccumGreenBits;
-      break;
-    case GLX_ACCUM_BLUE_SIZE:
-      *value = visual->cAccumBlueBits;
-      break;
-    case GLX_ACCUM_ALPHA_SIZE:
-      *value = visual->cAccumAlphaBits;
-      break;
-  }
-}
-
-////////////////////////////////////////////////////////////////////
-//     Function: try_for_visual
-//  Description: This is a static function that attempts to get the
-//               requested visual, if it is available.  It's just a
-//               wrapper around glXChooseVisual().  It returns the
-//               visual information if possible, or NULL if it is not.
-////////////////////////////////////////////////////////////////////
-PIXELFORMATDESCRIPTOR* wglGraphicsWindow::
-try_for_visual(wglGraphicsPipe *pipe, int mask,
-           int want_depth_bits, int want_color_bits) {
-  static const int max_attrib_list = 32;
-  int attrib_list[max_attrib_list];
-  int n=0;
-
-  wgldisplay_cat.debug()
-    << "Trying for visual with: RGB(" << want_color_bits << ")";
-
-  int want_color_component_bits;
-  if (mask & W_ALPHA) {
-    want_color_component_bits = max(want_color_bits / 4, 1);
-  } else {
-    want_color_component_bits = max(want_color_bits / 3, 1);
-  }
-
-  attrib_list[n++] = GLX_RGBA;
-  attrib_list[n++] = GLX_RED_SIZE;
-  attrib_list[n++] = want_color_component_bits;
-  attrib_list[n++] = GLX_GREEN_SIZE;
-  attrib_list[n++] = want_color_component_bits;
-  attrib_list[n++] = GLX_BLUE_SIZE;
-  attrib_list[n++] = want_color_component_bits;
-
-  if (mask & W_ALPHA) {
-    wgldisplay_cat.debug(false) << " ALPHA";
-    attrib_list[n++] = GLX_ALPHA_SIZE;
-    attrib_list[n++] = want_color_component_bits;
-  }
-  if (mask & W_DOUBLE) {
-    wgldisplay_cat.debug(false) << " DOUBLEBUFFER";
-    attrib_list[n++] = GLX_DOUBLEBUFFER;
-  }
-  if (mask & W_STEREO) {
-    wgldisplay_cat.debug(false) << " STEREO";
-    attrib_list[n++] = GLX_STEREO;
-  }
-  if (mask & W_DEPTH) {
-    wgldisplay_cat.debug(false) << " DEPTH(" << want_depth_bits << ")";
-    attrib_list[n++] = GLX_DEPTH_SIZE;
-    attrib_list[n++] = want_depth_bits;
-  }
-  if (mask & W_STENCIL) {
-    wgldisplay_cat.debug(false) << " STENCIL";
-    attrib_list[n++] = GLX_STENCIL_SIZE;
-    attrib_list[n++] = 1;
-  }
-  if (mask & W_ACCUM) {
-    wgldisplay_cat.debug(false) << " ACCUM";
-    attrib_list[n++] = GLX_ACCUM_RED_SIZE;
-    attrib_list[n++] = want_color_component_bits;
-    attrib_list[n++] = GLX_ACCUM_GREEN_SIZE;
-    attrib_list[n++] = want_color_component_bits;
-    attrib_list[n++] = GLX_ACCUM_BLUE_SIZE;
-    attrib_list[n++] = want_color_component_bits;
-    if (mask & W_ALPHA) {
-      attrib_list[n++] = GLX_ACCUM_ALPHA_SIZE;
-      attrib_list[n++] = want_color_component_bits;
-    }
-  }
-
-  // Terminate the list
-  nassertr(n < max_attrib_list, NULL);
-  attrib_list[n] = 0L;
-
-  PIXELFORMATDESCRIPTOR pfd;
-  PIXELFORMATDESCRIPTOR *match = NULL;
-  bool stereo = false;
-
-  memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
-  pfd.nSize = (sizeof(PIXELFORMATDESCRIPTOR));
-  pfd.nVersion = 1;
-
-  // Defaults
-  pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
-  pfd.iPixelType = PFD_TYPE_COLORINDEX;
-  pfd.cColorBits = 32;
-  pfd.cDepthBits = 0;
-
-  int *p = attrib_list;
-  while (*p) {
-    switch (*p) {
-      case GLX_USE_GL:
-    pfd.dwFlags |= PFD_SUPPORT_OPENGL;
-    break;
-      case GLX_LEVEL:
-    pfd.bReserved = *(++p);
-    break;
-      case GLX_RGBA:
-    pfd.iPixelType = PFD_TYPE_RGBA;
-    break;
-      case GLX_DOUBLEBUFFER:
-    pfd.dwFlags |= PFD_DOUBLEBUFFER;
-    break;
-      case GLX_STEREO:
-    stereo = true;
-    pfd.dwFlags |= PFD_STEREO;
-    break;
-      case GLX_AUX_BUFFERS:
-    pfd.cAuxBuffers = *(++p);
-    break;
-      case GLX_RED_SIZE:
-    pfd.cRedBits = 8; // Try to get the maximum
-    ++p;
-    break;
-      case GLX_GREEN_SIZE:
-    pfd.cGreenBits = 8; // Try to get the maximum
-    ++p;
-    break;
-      case GLX_BLUE_SIZE:
-    pfd.cBlueBits = 8; // Try to get the maximum
-    ++p;
-    break;
-      case GLX_ALPHA_SIZE:
-    pfd.cAlphaBits = 8; // Try to get the maximum
-    ++p;
-    break;
-      case GLX_DEPTH_SIZE:
-    pfd.cDepthBits = 32; // Try to get the maximum
-    ++p;
-    break;
-      case GLX_STENCIL_SIZE:
-    pfd.cStencilBits = *(++p);
-    break;
-      case GLX_ACCUM_RED_SIZE:
-      case GLX_ACCUM_GREEN_SIZE:
-      case GLX_ACCUM_BLUE_SIZE:
-      case GLX_ACCUM_ALPHA_SIZE:
-    // Only cAccumBits is used for requesting accum buffer
-    pfd.cAccumBits = 1;
-    ++p;
-    break;
-    }
-    ++p;
-  }
-
-  int pf = ChoosePixelFormat(_hdc, &pfd);
-  if (pf > 0) {
-    DescribePixelFormat(_hdc, pf, sizeof(PIXELFORMATDESCRIPTOR), &_pixelformat);
-
-    // ChoosePixelFormat is dumb about stereo
-    if (stereo) {
-      if (!(_pixelformat->dwFlags & PFD_STEREO)) {
-          wgldisplay_cat.info() << "try_for_visual() - request for stereo failed" << endl;
-      }
-    }
-  }
-
-  return match;
-}
-
-#endif
-
-extern char *ConvDDErrorToString(const HRESULT &error) {
-    switch(error) {
-        case E_FAIL:
-            return "Unspecified error E_FAIL";
-
-        case DD_OK:
-            return "No error.\0";
-
-        case DDERR_ALREADYINITIALIZED     : // (5)
-            return "DDERR_ALREADYINITIALIZED        ";//: // (5)
-        case DDERR_CANNOTATTACHSURFACE        : // (10)
-            return "DDERR_CANNOTATTACHSURFACE       ";//: // (10)
-        case DDERR_CANNOTDETACHSURFACE        : // (20)
-            return "DDERR_CANNOTDETACHSURFACE       ";//: // (20)
-        case DDERR_CURRENTLYNOTAVAIL          : // (40)
-            return "DDERR_CURRENTLYNOTAVAIL         ";//: // (40)
-        case DDERR_EXCEPTION              : // (55)
-            return "DDERR_EXCEPTION             ";//: // (55)
-        case DDERR_HEIGHTALIGN            : // (90)
-            return "DDERR_HEIGHTALIGN           ";//: // (90)
-        case DDERR_INCOMPATIBLEPRIMARY        : // (95)
-            return "DDERR_INCOMPATIBLEPRIMARY       ";//: // (95)
-        case DDERR_INVALIDCAPS            : // (100)
-            return "DDERR_INVALIDCAPS           ";//: // (100)
-        case DDERR_INVALIDCLIPLIST            : // (110)
-            return "DDERR_INVALIDCLIPLIST           ";//: // (110)
-        case DDERR_INVALIDMODE            : // (120)
-            return "DDERR_INVALIDMODE           ";//: // (120)
-        case DDERR_INVALIDOBJECT          : // (130)
-            return "DDERR_INVALIDOBJECT         ";//: // (130)
-        case DDERR_INVALIDPIXELFORMAT     : // (145)
-            return "DDERR_INVALIDPIXELFORMAT        ";//: // (145)
-        case DDERR_INVALIDRECT            : // (150)
-            return "DDERR_INVALIDRECT           ";//: // (150)
-        case DDERR_LOCKEDSURFACES         : // (160)
-            return "DDERR_LOCKEDSURFACES            ";//: // (160)
-        case DDERR_NO3D               : // (170)
-            return "DDERR_NO3D              ";//: // (170)
-        case DDERR_NOALPHAHW              : // (180)
-            return "DDERR_NOALPHAHW             ";//: // (180)
-        case DDERR_NOCLIPLIST         : // (205)
-            return "DDERR_NOCLIPLIST            ";//: // (205)
-        case DDERR_NOCOLORCONVHW          : // (210)
-            return "DDERR_NOCOLORCONVHW         ";//: // (210)
-        case DDERR_NOCOOPERATIVELEVELSET      : // (212)
-            return "DDERR_NOCOOPERATIVELEVELSET     ";//: // (212)
-        case DDERR_NOCOLORKEY         : // (215)
-            return "DDERR_NOCOLORKEY            ";//: // (215)
-        case DDERR_NOCOLORKEYHW           : // (220)
-            return "DDERR_NOCOLORKEYHW          ";//: // (220)
-        case DDERR_NODIRECTDRAWSUPPORT        : // (222)
-            return "DDERR_NODIRECTDRAWSUPPORT       ";//: // (222)
-        case DDERR_NOEXCLUSIVEMODE            : // (225)
-            return "DDERR_NOEXCLUSIVEMODE           ";//: // (225)
-        case DDERR_NOFLIPHW               : // (230)
-            return "DDERR_NOFLIPHW              ";//: // (230)
-        case DDERR_NOGDI              : // (240)
-            return "DDERR_NOGDI             ";//: // (240)
-        case DDERR_NOMIRRORHW         : // (250)
-            return "DDERR_NOMIRRORHW            ";//: // (250)
-        case DDERR_NOTFOUND               : // (255)
-            return "DDERR_NOTFOUND              ";//: // (255)
-        case DDERR_NOOVERLAYHW            : // (260)
-        return "DDERR_NOOVERLAYHW           ";//: // (260)
-        case DDERR_NORASTEROPHW           : // (280)
-            return "DDERR_NORASTEROPHW          ";//: // (280)
-        case DDERR_NOROTATIONHW           : // (290)
-            return "DDERR_NOROTATIONHW          ";//: // (290)
-        case DDERR_NOSTRETCHHW            : // (310)
-            return "DDERR_NOSTRETCHHW           ";//: // (310)
-        case DDERR_NOT4BITCOLOR           : // (316)
-            return "DDERR_NOT4BITCOLOR          ";//: // (316)
-        case DDERR_NOT4BITCOLORINDEX          : // (317)
-            return "DDERR_NOT4BITCOLORINDEX         ";//: // (317)
-        case DDERR_NOT8BITCOLOR           : // (320)
-            return "DDERR_NOT8BITCOLOR          ";//: // (320)
-        case DDERR_NOTEXTUREHW            : // (330)
-            return "DDERR_NOTEXTUREHW           ";//: // (330)
-        case DDERR_NOVSYNCHW              : // (335)
-            return "DDERR_NOVSYNCHW             ";//: // (335)
-        case DDERR_NOZBUFFERHW            : // (340)
-            return "DDERR_NOZBUFFERHW           ";//: // (340)
-        case DDERR_NOZOVERLAYHW           : // (350)
-            return "DDERR_NOZOVERLAYHW          ";//: // (350)
-        case DDERR_OUTOFCAPS              : // (360)
-            return "DDERR_OUTOFCAPS             ";//: // (360)
-        case DDERR_OUTOFVIDEOMEMORY           : // (380)
-            return "DDERR_OUTOFVIDEOMEMORY          ";//: // (380)
-        case DDERR_OVERLAYCANTCLIP            : // (382)
-            return "DDERR_OVERLAYCANTCLIP           ";//: // (382)
-        case DDERR_OVERLAYCOLORKEYONLYONEACTIVE   : // (384)
-            return "DDERR_OVERLAYCOLORKEYONLYONEACTIVE  ";//: // (384)
-        case DDERR_PALETTEBUSY            : // (387)
-            return "DDERR_PALETTEBUSY           ";//: // (387)
-        case DDERR_COLORKEYNOTSET         : // (400)
-            return "DDERR_COLORKEYNOTSET            ";//: // (400)
-        case DDERR_SURFACEALREADYATTACHED     : // (410)
-            return "DDERR_SURFACEALREADYATTACHED        ";//: // (410)
-        case DDERR_SURFACEALREADYDEPENDENT        : // (420)
-            return "DDERR_SURFACEALREADYDEPENDENT       ";//: // (420)
-        case DDERR_SURFACEBUSY            : // (430)
-            return "DDERR_SURFACEBUSY           ";//: // (430)
-        case DDERR_CANTLOCKSURFACE                   : // (435)
-            return "DDERR_CANTLOCKSURFACE";//: // (435)
-        case DDERR_SURFACEISOBSCURED          : // (440)
-            return "DDERR_SURFACEISOBSCURED         ";//: // (440)
-        case DDERR_SURFACELOST            : // (450)
-            return "DDERR_SURFACELOST           ";//: // (450)
-        case DDERR_SURFACENOTATTACHED     : // (460)
-            return "DDERR_SURFACENOTATTACHED        ";//: // (460)
-        case DDERR_TOOBIGHEIGHT           : // (470)
-            return "DDERR_TOOBIGHEIGHT          ";//: // (470)
-        case DDERR_TOOBIGSIZE         : // (480)
-            return "DDERR_TOOBIGSIZE            ";//: // (480)
-        case DDERR_TOOBIGWIDTH            : // (490)
-            return "DDERR_TOOBIGWIDTH           ";//: // (490)
-        case DDERR_UNSUPPORTEDFORMAT          : // (510)
-            return "DDERR_UNSUPPORTEDFORMAT         ";//: // (510)
-        case DDERR_UNSUPPORTEDMASK            : // (520)
-            return "DDERR_UNSUPPORTEDMASK           ";//: // (520)
-        case DDERR_VERTICALBLANKINPROGRESS        : // (537)
-            return "DDERR_VERTICALBLANKINPROGRESS       ";//: // (537)
-        case DDERR_WASSTILLDRAWING            : // (540)
-            return "DDERR_WASSTILLDRAWING           ";//: // (540)
-        case DDERR_XALIGN             : // (560)
-            return "DDERR_XALIGN                ";//: // (560)
-        case DDERR_INVALIDDIRECTDRAWGUID      : // (561)
-            return "DDERR_INVALIDDIRECTDRAWGUID     ";//: // (561)
-        case DDERR_DIRECTDRAWALREADYCREATED       : // (562)
-            return "DDERR_DIRECTDRAWALREADYCREATED      ";//: // (562)
-        case DDERR_NODIRECTDRAWHW         : // (563)
-            return "DDERR_NODIRECTDRAWHW            ";//: // (563)
-        case DDERR_PRIMARYSURFACEALREADYEXISTS    : // (564)
-            return "DDERR_PRIMARYSURFACEALREADYEXISTS   ";//: // (564)
-        case DDERR_NOEMULATION            : // (565)
-            return "DDERR_NOEMULATION           ";//: // (565)
-        case DDERR_REGIONTOOSMALL         : // (566)
-            return "DDERR_REGIONTOOSMALL            ";//: // (566)
-        case DDERR_CLIPPERISUSINGHWND     : // (567)
-            return "DDERR_CLIPPERISUSINGHWND        ";//: // (567)
-        case DDERR_NOCLIPPERATTACHED          : // (568)
-            return "DDERR_NOCLIPPERATTACHED         ";//: // (568)
-        case DDERR_NOHWND             : // (569)
-            return "DDERR_NOHWND                ";//: // (569)
-        case DDERR_HWNDSUBCLASSED         : // (570)
-            return "DDERR_HWNDSUBCLASSED            ";//: // (570)
-        case DDERR_HWNDALREADYSET         : // (571)
-            return "DDERR_HWNDALREADYSET            ";//: // (571)
-        case DDERR_NOPALETTEATTACHED          : // (572)
-            return "DDERR_NOPALETTEATTACHED         ";//: // (572)
-        case DDERR_NOPALETTEHW            : // (573)
-            return "DDERR_NOPALETTEHW           ";//: // (573)
-        case DDERR_BLTFASTCANTCLIP            : // (574)
-            return "DDERR_BLTFASTCANTCLIP           ";//: // (574)
-        case DDERR_NOBLTHW                : // (575)
-            return "DDERR_NOBLTHW               ";//: // (575)
-        case DDERR_NODDROPSHW         : // (576)
-            return "DDERR_NODDROPSHW            ";//: // (576)
-        case DDERR_OVERLAYNOTVISIBLE          : // (577)
-            return "DDERR_OVERLAYNOTVISIBLE         ";//: // (577)
-        case DDERR_NOOVERLAYDEST          : // (578)
-            return "DDERR_NOOVERLAYDEST         ";//: // (578)
-        case DDERR_INVALIDPOSITION            : // (579)
-            return "DDERR_INVALIDPOSITION           ";//: // (579)
-        case DDERR_NOTAOVERLAYSURFACE     : // (580)
-            return "DDERR_NOTAOVERLAYSURFACE        ";//: // (580)
-        case DDERR_EXCLUSIVEMODEALREADYSET        : // (581)
-            return "DDERR_EXCLUSIVEMODEALREADYSET       ";//: // (581)
-        case DDERR_NOTFLIPPABLE           : // (582)
-            return "DDERR_NOTFLIPPABLE          ";//: // (582)
-        case DDERR_CANTDUPLICATE          : // (583)
-            return "DDERR_CANTDUPLICATE         ";//: // (583)
-        case DDERR_NOTLOCKED              : // (584)
-            return "DDERR_NOTLOCKED             ";//: // (584)
-        case DDERR_CANTCREATEDC           : // (585)
-            return "DDERR_CANTCREATEDC          ";//: // (585)
-        case DDERR_NODC               : // (586)
-            return "DDERR_NODC              ";//: // (586)
-        case DDERR_WRONGMODE              : // (587)
-            return "DDERR_WRONGMODE             ";//: // (587)
-        case DDERR_IMPLICITLYCREATED          : // (588)
-            return "DDERR_IMPLICITLYCREATED         ";//: // (588)
-        case DDERR_NOTPALETTIZED          : // (589)
-            return "DDERR_NOTPALETTIZED         ";//: // (589)
-        case DDERR_UNSUPPORTEDMODE            : // (590)
-            return "DDERR_UNSUPPORTEDMODE           ";//: // (590)
-        case DDERR_NOMIPMAPHW         : // (591)
-            return "DDERR_NOMIPMAPHW            ";//: // (591)
-        case DDERR_INVALIDSURFACETYPE                : // (592)
-            return "DDERR_INVALIDSURFACETYPE";//: // (592)
-        case DDERR_NOOPTIMIZEHW                      : // (600)
-            return "DDERR_NOOPTIMIZEHW";//: // (600)
-        case DDERR_NOTLOADED                         : // (601)
-            return "DDERR_NOTLOADED";//: // (601)
-        case DDERR_NOFOCUSWINDOW                     : // (602)
-            return "DDERR_NOFOCUSWINDOW";//: // (602)
-        case DDERR_DCALREADYCREATED           : // (620)
-            return "DDERR_DCALREADYCREATED          ";//: // (620)
-        case DDERR_NONONLOCALVIDMEM                  : // (630)
-            return "DDERR_NONONLOCALVIDMEM";//: // (630)
-        case DDERR_CANTPAGELOCK           : // (640)
-            return "DDERR_CANTPAGELOCK          ";//: // (640)
-        case DDERR_CANTPAGEUNLOCK         : // (660)
-            return "DDERR_CANTPAGEUNLOCK            ";//: // (660)
-        case DDERR_NOTPAGELOCKED          : // (680)
-            return "DDERR_NOTPAGELOCKED         ";//: // (680)
-        case DDERR_MOREDATA                   : // (690)
-            return "DDERR_MOREDATA                  ";//: // (690)
-        case DDERR_VIDEONOTACTIVE             : // (695)
-            return "DDERR_VIDEONOTACTIVE            ";//: // (695)
-        case DDERR_DEVICEDOESNTOWNSURFACE         : // (699)
-            return "DDERR_DEVICEDOESNTOWNSURFACE        ";//: // (699)
-
-        case E_UNEXPECTED                     :
-            return "E_UNEXPECTED                     ";
-        case E_NOTIMPL                        :
-            return "E_NOTIMPL                        ";
-        case E_OUTOFMEMORY                    :
-            return "E_OUTOFMEMORY                    ";
-        case E_INVALIDARG                     :
-            return "E_INVALIDARG or DDERR_INVALIDPARAMS";
-        case E_NOINTERFACE                    :
-            return "E_NOINTERFACE                    ";
-        case E_POINTER                        :
-            return "E_POINTER                        ";
-        case E_HANDLE                         :
-            return "E_HANDLE                         ";
-        case E_ABORT                          :
-            return "E_ABORT                          ";
-//    case E_FAIL                           :
-//    return "E_FAIL                           ";
-        case E_ACCESSDENIED                   :
-            return "E_ACCESSDENIED                   ";
-        case E_PENDING                        :
-            return "E_PENDING                        ";
-        case CO_E_INIT_TLS                    :
-            return "CO_E_INIT_TLS                    ";
-        case CO_E_INIT_SHARED_ALLOCATOR       :
-            return "CO_E_INIT_SHARED_ALLOCATOR       ";
-        case CO_E_INIT_MEMORY_ALLOCATOR       :
-            return "CO_E_INIT_MEMORY_ALLOCATOR       ";
-        case CO_E_INIT_CLASS_CACHE            :
-            return "CO_E_INIT_CLASS_CACHE            ";
-        case CO_E_INIT_RPC_CHANNEL            :
-            return "CO_E_INIT_RPC_CHANNEL            ";
-        case CO_E_INIT_TLS_SET_CHANNEL_CONTROL :
-            return "CO_E_INIT_TLS_SET_CHANNEL_CONTROL ";
-        case CO_E_INIT_TLS_CHANNEL_CONTROL    :
-            return "CO_E_INIT_TLS_CHANNEL_CONTROL    ";
-        case CO_E_INIT_UNACCEPTED_USER_ALLOCATOR :
-            return "CO_E_INIT_UNACCEPTED_USER_ALLOCATOR ";
-        case CO_E_INIT_SCM_MUTEX_EXISTS       :
-            return "CO_E_INIT_SCM_MUTEX_EXISTS       ";
-        case CO_E_INIT_SCM_FILE_MAPPING_EXISTS :
-            return "CO_E_INIT_SCM_FILE_MAPPING_EXISTS ";
-        case CO_E_INIT_SCM_MAP_VIEW_OF_FILE   :
-            return "CO_E_INIT_SCM_MAP_VIEW_OF_FILE   ";
-        case CO_E_INIT_SCM_EXEC_FAILURE       :
-            return "CO_E_INIT_SCM_EXEC_FAILURE       ";
-        case CO_E_INIT_ONLY_SINGLE_THREADED   :
-            return "CO_E_INIT_ONLY_SINGLE_THREADED   ";
-        case CO_E_CANT_REMOTE                 :
-            return "CO_E_CANT_REMOTE                 ";
-        case CO_E_BAD_SERVER_NAME             :
-            return "CO_E_BAD_SERVER_NAME             ";
-        case CO_E_WRONG_SERVER_IDENTITY       :
-            return "CO_E_WRONG_SERVER_IDENTITY       ";
-        case CO_E_OLE1DDE_DISABLED            :
-            return "CO_E_OLE1DDE_DISABLED            ";
-        case CO_E_RUNAS_SYNTAX                :
-            return "CO_E_RUNAS_SYNTAX                ";
-        case CO_E_CREATEPROCESS_FAILURE       :
-            return "CO_E_CREATEPROCESS_FAILURE       ";
-        case CO_E_RUNAS_CREATEPROCESS_FAILURE :
-            return "CO_E_RUNAS_CREATEPROCESS_FAILURE ";
-        case CO_E_RUNAS_LOGON_FAILURE         :
-            return "CO_E_RUNAS_LOGON_FAILURE         ";
-        case CO_E_LAUNCH_PERMSSION_DENIED     :
-            return "CO_E_LAUNCH_PERMSSION_DENIED     ";
-        case CO_E_START_SERVICE_FAILURE       :
-            return "CO_E_START_SERVICE_FAILURE       ";
-        case CO_E_REMOTE_COMMUNICATION_FAILURE :
-            return "CO_E_REMOTE_COMMUNICATION_FAILURE ";
-        case CO_E_SERVER_START_TIMEOUT        :
-            return "CO_E_SERVER_START_TIMEOUT        ";
-        case CO_E_CLSREG_INCONSISTENT         :
-            return "CO_E_CLSREG_INCONSISTENT         ";
-        case CO_E_IIDREG_INCONSISTENT         :
-            return "CO_E_IIDREG_INCONSISTENT         ";
-        case CO_E_NOT_SUPPORTED               :
-            return "CO_E_NOT_SUPPORTED               ";
-        case CO_E_RELOAD_DLL                  :
-            return "CO_E_RELOAD_DLL                  ";
-        case CO_E_MSI_ERROR                   :
-            return "CO_E_MSI_ERROR                   ";
-        case OLE_E_OLEVERB                    :
-            return "OLE_E_OLEVERB                    ";
-        case OLE_E_ADVF                       :
-            return "OLE_E_ADVF                       ";
-        case OLE_E_ENUM_NOMORE                :
-            return "OLE_E_ENUM_NOMORE                ";
-        case OLE_E_ADVISENOTSUPPORTED         :
-            return "OLE_E_ADVISENOTSUPPORTED         ";
-        case OLE_E_NOCONNECTION               :
-            return "OLE_E_NOCONNECTION               ";
-        case OLE_E_NOTRUNNING                 :
-            return "OLE_E_NOTRUNNING                 ";
-        case OLE_E_NOCACHE                    :
-            return "OLE_E_NOCACHE                    ";
-        case OLE_E_BLANK                      :
-            return "OLE_E_BLANK                      ";
-        case OLE_E_CLASSDIFF                  :
-            return "OLE_E_CLASSDIFF                  ";
-        case OLE_E_CANT_GETMONIKER            :
-            return "OLE_E_CANT_GETMONIKER            ";
-        case OLE_E_CANT_BINDTOSOURCE          :
-            return "OLE_E_CANT_BINDTOSOURCE          ";
-        case OLE_E_STATIC                     :
-            return "OLE_E_STATIC                     ";
-        case OLE_E_PROMPTSAVECANCELLED        :
-            return "OLE_E_PROMPTSAVECANCELLED        ";
-        case OLE_E_INVALIDRECT                :
-            return "OLE_E_INVALIDRECT                ";
-        case OLE_E_WRONGCOMPOBJ               :
-            return "OLE_E_WRONGCOMPOBJ               ";
-        case OLE_E_INVALIDHWND                :
-            return "OLE_E_INVALIDHWND                ";
-        case OLE_E_NOT_INPLACEACTIVE          :
-            return "OLE_E_NOT_INPLACEACTIVE          ";
-        case OLE_E_CANTCONVERT                :
-            return "OLE_E_CANTCONVERT                ";
-        case OLE_E_NOSTORAGE                  :
-            return "OLE_E_NOSTORAGE                  ";
-        case DV_E_FORMATETC                   :
-            return "DV_E_FORMATETC                   ";
-        case DV_E_DVTARGETDEVICE              :
-            return "DV_E_DVTARGETDEVICE              ";
-        case DV_E_STGMEDIUM                   :
-            return "DV_E_STGMEDIUM                   ";
-        case DV_E_STATDATA                    :
-            return "DV_E_STATDATA                    ";
-        case DV_E_LINDEX                      :
-            return "DV_E_LINDEX                      ";
-        case DV_E_TYMED                       :
-            return "DV_E_TYMED                       ";
-        case DV_E_CLIPFORMAT                  :
-            return "DV_E_CLIPFORMAT                  ";
-        case DV_E_DVASPECT                    :
-            return "DV_E_DVASPECT                    ";
-        case DV_E_DVTARGETDEVICE_SIZE         :
-            return "DV_E_DVTARGETDEVICE_SIZE         ";
-        case DV_E_NOIVIEWOBJECT               :
-            return "DV_E_NOIVIEWOBJECT               ";
-        case DRAGDROP_E_NOTREGISTERED         :
-            return "DRAGDROP_E_NOTREGISTERED         ";
-        case DRAGDROP_E_ALREADYREGISTERED     :
-            return "DRAGDROP_E_ALREADYREGISTERED     ";
-        case DRAGDROP_E_INVALIDHWND           :
-            return "DRAGDROP_E_INVALIDHWND           ";
-        case CLASS_E_NOAGGREGATION            :
-            return "CLASS_E_NOAGGREGATION            ";
-        case CLASS_E_CLASSNOTAVAILABLE        :
-            return "CLASS_E_CLASSNOTAVAILABLE        ";
-        case CLASS_E_NOTLICENSED              :
-            return "CLASS_E_NOTLICENSED              ";
-        case VIEW_E_DRAW                      :
-            return "VIEW_E_DRAW                      ";
-        case REGDB_E_READREGDB                :
-            return "REGDB_E_READREGDB                ";
-        case REGDB_E_WRITEREGDB               :
-            return "REGDB_E_WRITEREGDB               ";
-        case REGDB_E_KEYMISSING               :
-            return "REGDB_E_KEYMISSING               ";
-        case REGDB_E_INVALIDVALUE             :
-            return "REGDB_E_INVALIDVALUE             ";
-        case REGDB_E_CLASSNOTREG              :
-            return "REGDB_E_CLASSNOTREG              ";
-        case REGDB_E_IIDNOTREG                :
-            return "REGDB_E_IIDNOTREG                ";
-        case CAT_E_CATIDNOEXIST               :
-            return "CAT_E_CATIDNOEXIST               ";
-        case CAT_E_NODESCRIPTION              :
-            return "CAT_E_NODESCRIPTION              ";
-        case CS_E_PACKAGE_NOTFOUND            :
-            return "CS_E_PACKAGE_NOTFOUND            ";
-        case CS_E_NOT_DELETABLE               :
-            return "CS_E_NOT_DELETABLE               ";
-        case CS_E_CLASS_NOTFOUND              :
-            return "CS_E_CLASS_NOTFOUND              ";
-        case CS_E_INVALID_VERSION             :
-            return "CS_E_INVALID_VERSION             ";
-        case CS_E_NO_CLASSSTORE               :
-            return "CS_E_NO_CLASSSTORE               ";
-        case CACHE_E_NOCACHE_UPDATED          :
-            return "CACHE_E_NOCACHE_UPDATED          ";
-        case OLEOBJ_E_NOVERBS                 :
-            return "OLEOBJ_E_NOVERBS                 ";
-        case OLEOBJ_E_INVALIDVERB             :
-            return "OLEOBJ_E_INVALIDVERB             ";
-        case INPLACE_E_NOTUNDOABLE            :
-            return "INPLACE_E_NOTUNDOABLE            ";
-        case INPLACE_E_NOTOOLSPACE            :
-            return "INPLACE_E_NOTOOLSPACE            ";
-        case CONVERT10_E_OLESTREAM_GET        :
-            return "CONVERT10_E_OLESTREAM_GET        ";
-        case CONVERT10_E_OLESTREAM_PUT        :
-            return "CONVERT10_E_OLESTREAM_PUT        ";
-        case CONVERT10_E_OLESTREAM_FMT        :
-            return "CONVERT10_E_OLESTREAM_FMT        ";
-        case CONVERT10_E_OLESTREAM_BITMAP_TO_DIB :
-            return "CONVERT10_E_OLESTREAM_BITMAP_TO_DIB ";
-        case CONVERT10_E_STG_FMT              :
-            return "CONVERT10_E_STG_FMT              ";
-        case CONVERT10_E_STG_NO_STD_STREAM    :
-            return "CONVERT10_E_STG_NO_STD_STREAM    ";
-        case CONVERT10_E_STG_DIB_TO_BITMAP    :
-            return "CONVERT10_E_STG_DIB_TO_BITMAP    ";
-        case CLIPBRD_E_CANT_OPEN              :
-            return "CLIPBRD_E_CANT_OPEN              ";
-        case CLIPBRD_E_CANT_EMPTY             :
-            return "CLIPBRD_E_CANT_EMPTY             ";
-        case CLIPBRD_E_CANT_SET               :
-            return "CLIPBRD_E_CANT_SET               ";
-        case CLIPBRD_E_BAD_DATA               :
-            return "CLIPBRD_E_BAD_DATA               ";
-        case CLIPBRD_E_CANT_CLOSE             :
-            return "CLIPBRD_E_CANT_CLOSE             ";
-        case MK_E_CONNECTMANUALLY             :
-            return "MK_E_CONNECTMANUALLY             ";
-        case MK_E_EXCEEDEDDEADLINE            :
-            return "MK_E_EXCEEDEDDEADLINE            ";
-        case MK_E_NEEDGENERIC                 :
-            return "MK_E_NEEDGENERIC                 ";
-        case MK_E_UNAVAILABLE                 :
-            return "MK_E_UNAVAILABLE                 ";
-        case MK_E_SYNTAX                      :
-            return "MK_E_SYNTAX                      ";
-        case MK_E_NOOBJECT                    :
-            return "MK_E_NOOBJECT                    ";
-        case MK_E_INVALIDEXTENSION            :
-            return "MK_E_INVALIDEXTENSION            ";
-        case MK_E_INTERMEDIATEINTERFACENOTSUPPORTED :
-            return "MK_E_INTERMEDIATEINTERFACENOTSUPPORTED ";
-        case MK_E_NOTBINDABLE                 :
-            return "MK_E_NOTBINDABLE                 ";
-        case MK_E_NOTBOUND                    :
-            return "MK_E_NOTBOUND                    ";
-        case MK_E_CANTOPENFILE                :
-            return "MK_E_CANTOPENFILE                ";
-        case MK_E_MUSTBOTHERUSER              :
-            return "MK_E_MUSTBOTHERUSER              ";
-        case MK_E_NOINVERSE                   :
-            return "MK_E_NOINVERSE                   ";
-        case MK_E_NOSTORAGE                   :
-            return "MK_E_NOSTORAGE                   ";
-        case MK_E_NOPREFIX                    :
-            return "MK_E_NOPREFIX                    ";
-        case MK_E_ENUMERATION_FAILED          :
-            return "MK_E_ENUMERATION_FAILED          ";
-        case CO_E_NOTINITIALIZED              :
-            return "CO_E_NOTINITIALIZED              ";
-        case CO_E_ALREADYINITIALIZED          :
-            return "CO_E_ALREADYINITIALIZED          ";
-        case CO_E_CANTDETERMINECLASS          :
-            return "CO_E_CANTDETERMINECLASS          ";
-        case CO_E_CLASSSTRING                 :
-            return "CO_E_CLASSSTRING                 ";
-        case CO_E_IIDSTRING                   :
-            return "CO_E_IIDSTRING                   ";
-        case CO_E_APPNOTFOUND                 :
-            return "CO_E_APPNOTFOUND                 ";
-        case CO_E_APPSINGLEUSE                :
-            return "CO_E_APPSINGLEUSE                ";
-        case CO_E_ERRORINAPP                  :
-            return "CO_E_ERRORINAPP                  ";
-        case CO_E_DLLNOTFOUND                 :
-            return "CO_E_DLLNOTFOUND                 ";
-        case CO_E_ERRORINDLL                  :
-            return "CO_E_ERRORINDLL                  ";
-        case CO_E_WRONGOSFORAPP               :
-            return "CO_E_WRONGOSFORAPP               ";
-        case CO_E_OBJNOTREG                   :
-            return "CO_E_OBJNOTREG                   ";
-        case CO_E_OBJISREG                    :
-            return "CO_E_OBJISREG                    ";
-        case CO_E_OBJNOTCONNECTED             :
-            return "CO_E_OBJNOTCONNECTED             ";
-        case CO_E_APPDIDNTREG                 :
-            return "CO_E_APPDIDNTREG                 ";
-        case CO_E_RELEASED                    :
-            return "CO_E_RELEASED                    ";
-        case CO_E_FAILEDTOIMPERSONATE         :
-            return "CO_E_FAILEDTOIMPERSONATE         ";
-        case CO_E_FAILEDTOGETSECCTX           :
-            return "CO_E_FAILEDTOGETSECCTX           ";
-        case CO_E_FAILEDTOOPENTHREADTOKEN     :
-            return "CO_E_FAILEDTOOPENTHREADTOKEN     ";
-        case CO_E_FAILEDTOGETTOKENINFO        :
-            return "CO_E_FAILEDTOGETTOKENINFO        ";
-        case CO_E_TRUSTEEDOESNTMATCHCLIENT    :
-            return "CO_E_TRUSTEEDOESNTMATCHCLIENT    ";
-        case CO_E_FAILEDTOQUERYCLIENTBLANKET  :
-            return "CO_E_FAILEDTOQUERYCLIENTBLANKET  ";
-        case CO_E_FAILEDTOSETDACL             :
-            return "CO_E_FAILEDTOSETDACL             ";
-        case CO_E_ACCESSCHECKFAILED           :
-            return "CO_E_ACCESSCHECKFAILED           ";
-        case CO_E_NETACCESSAPIFAILED          :
-            return "CO_E_NETACCESSAPIFAILED          ";
-        case CO_E_WRONGTRUSTEENAMESYNTAX      :
-            return "CO_E_WRONGTRUSTEENAMESYNTAX      ";
-        case CO_E_INVALIDSID                  :
-            return "CO_E_INVALIDSID                  ";
-        case CO_E_CONVERSIONFAILED            :
-            return "CO_E_CONVERSIONFAILED            ";
-        case CO_E_NOMATCHINGSIDFOUND          :
-            return "CO_E_NOMATCHINGSIDFOUND          ";
-        case CO_E_LOOKUPACCSIDFAILED          :
-            return "CO_E_LOOKUPACCSIDFAILED          ";
-        case CO_E_NOMATCHINGNAMEFOUND         :
-            return "CO_E_NOMATCHINGNAMEFOUND         ";
-        case CO_E_LOOKUPACCNAMEFAILED         :
-            return "CO_E_LOOKUPACCNAMEFAILED         ";
-        case CO_E_SETSERLHNDLFAILED           :
-            return "CO_E_SETSERLHNDLFAILED           ";
-        case CO_E_FAILEDTOGETWINDIR           :
-            return "CO_E_FAILEDTOGETWINDIR           ";
-        case CO_E_PATHTOOLONG                 :
-            return "CO_E_PATHTOOLONG                 ";
-        case CO_E_FAILEDTOGENUUID             :
-            return "CO_E_FAILEDTOGENUUID             ";
-        case CO_E_FAILEDTOCREATEFILE          :
-            return "CO_E_FAILEDTOCREATEFILE          ";
-        case CO_E_FAILEDTOCLOSEHANDLE         :
-            return "CO_E_FAILEDTOCLOSEHANDLE         ";
-        case CO_E_EXCEEDSYSACLLIMIT           :
-            return "CO_E_EXCEEDSYSACLLIMIT           ";
-        case CO_E_ACESINWRONGORDER            :
-            return "CO_E_ACESINWRONGORDER            ";
-        case CO_E_INCOMPATIBLESTREAMVERSION   :
-            return "CO_E_INCOMPATIBLESTREAMVERSION   ";
-        case CO_E_FAILEDTOOPENPROCESSTOKEN    :
-            return "CO_E_FAILEDTOOPENPROCESSTOKEN    ";
-        case CO_E_DECODEFAILED                :
-            return "CO_E_DECODEFAILED                ";
-        case CO_E_ACNOTINITIALIZED            :
-            return "CO_E_ACNOTINITIALIZED            ";
-        case OLE_S_USEREG                     :
-            return "OLE_S_USEREG                     ";
-        case OLE_S_STATIC                     :
-            return "OLE_S_STATIC                     ";
-        case OLE_S_MAC_CLIPFORMAT             :
-            return "OLE_S_MAC_CLIPFORMAT             ";
-        case DRAGDROP_S_DROP                  :
-            return "DRAGDROP_S_DROP                  ";
-        case DRAGDROP_S_CANCEL                :
-            return "DRAGDROP_S_CANCEL                ";
-        case DRAGDROP_S_USEDEFAULTCURSORS     :
-            return "DRAGDROP_S_USEDEFAULTCURSORS     ";
-        case DATA_S_SAMEFORMATETC             :
-            return "DATA_S_SAMEFORMATETC             ";
-        case VIEW_S_ALREADY_FROZEN            :
-            return "VIEW_S_ALREADY_FROZEN            ";
-        case CACHE_S_FORMATETC_NOTSUPPORTED   :
-            return "CACHE_S_FORMATETC_NOTSUPPORTED   ";
-        case CACHE_S_SAMECACHE                :
-            return "CACHE_S_SAMECACHE                ";
-        case CACHE_S_SOMECACHES_NOTUPDATED    :
-            return "CACHE_S_SOMECACHES_NOTUPDATED    ";
-        case OLEOBJ_S_INVALIDVERB             :
-            return "OLEOBJ_S_INVALIDVERB             ";
-        case OLEOBJ_S_CANNOT_DOVERB_NOW       :
-            return "OLEOBJ_S_CANNOT_DOVERB_NOW       ";
-        case OLEOBJ_S_INVALIDHWND             :
-            return "OLEOBJ_S_INVALIDHWND             ";
-        case INPLACE_S_TRUNCATED              :
-            return "INPLACE_S_TRUNCATED              ";
-        case CONVERT10_S_NO_PRESENTATION      :
-            return "CONVERT10_S_NO_PRESENTATION      ";
-        case MK_S_REDUCED_TO_SELF             :
-            return "MK_S_REDUCED_TO_SELF             ";
-        case MK_S_ME                          :
-            return "MK_S_ME                          ";
-        case MK_S_HIM                         :
-            return "MK_S_HIM                         ";
-        case MK_S_US                          :
-            return "MK_S_US                          ";
-        case MK_S_MONIKERALREADYREGISTERED    :
-            return "MK_S_MONIKERALREADYREGISTERED    ";
-        case CO_E_CLASS_CREATE_FAILED         :
-            return "CO_E_CLASS_CREATE_FAILED         ";
-        case CO_E_SCM_ERROR                   :
-            return "CO_E_SCM_ERROR                   ";
-        case CO_E_SCM_RPC_FAILURE             :
-            return "CO_E_SCM_RPC_FAILURE             ";
-        case CO_E_BAD_PATH                    :
-            return "CO_E_BAD_PATH                    ";
-        case CO_E_SERVER_EXEC_FAILURE         :
-            return "CO_E_SERVER_EXEC_FAILURE         ";
-        case CO_E_OBJSRV_RPC_FAILURE          :
-            return "CO_E_OBJSRV_RPC_FAILURE          ";
-        case MK_E_NO_NORMALIZED               :
-            return "MK_E_NO_NORMALIZED               ";
-        case CO_E_SERVER_STOPPING             :
-            return "CO_E_SERVER_STOPPING             ";
-        case MEM_E_INVALID_ROOT               :
-            return "MEM_E_INVALID_ROOT               ";
-        case MEM_E_INVALID_LINK               :
-            return "MEM_E_INVALID_LINK               ";
-        case MEM_E_INVALID_SIZE               :
-            return "MEM_E_INVALID_SIZE               ";
-        case CO_S_NOTALLINTERFACES            :
-            return "CO_S_NOTALLINTERFACES            ";
-        case DISP_E_UNKNOWNINTERFACE          :
-            return "DISP_E_UNKNOWNINTERFACE          ";
-        case DISP_E_MEMBERNOTFOUND            :
-            return "DISP_E_MEMBERNOTFOUND            ";
-        case DISP_E_PARAMNOTFOUND             :
-            return "DISP_E_PARAMNOTFOUND             ";
-        case DISP_E_TYPEMISMATCH              :
-            return "DISP_E_TYPEMISMATCH              ";
-        case DISP_E_UNKNOWNNAME               :
-            return "DISP_E_UNKNOWNNAME               ";
-        case DISP_E_NONAMEDARGS               :
-            return "DISP_E_NONAMEDARGS               ";
-        case DISP_E_BADVARTYPE                :
-            return "DISP_E_BADVARTYPE                ";
-        case DISP_E_EXCEPTION                 :
-            return "DISP_E_EXCEPTION                 ";
-        case DISP_E_OVERFLOW                  :
-            return "DISP_E_OVERFLOW                  ";
-        case DISP_E_BADINDEX                  :
-            return "DISP_E_BADINDEX                  ";
-        case DISP_E_UNKNOWNLCID               :
-            return "DISP_E_UNKNOWNLCID               ";
-        case DISP_E_ARRAYISLOCKED             :
-            return "DISP_E_ARRAYISLOCKED             ";
-        case DISP_E_BADPARAMCOUNT             :
-            return "DISP_E_BADPARAMCOUNT             ";
-        case DISP_E_PARAMNOTOPTIONAL          :
-            return "DISP_E_PARAMNOTOPTIONAL          ";
-        case DISP_E_BADCALLEE                 :
-            return "DISP_E_BADCALLEE                 ";
-        case DISP_E_NOTACOLLECTION            :
-            return "DISP_E_NOTACOLLECTION            ";
-        case DISP_E_DIVBYZERO                 :
-            return "DISP_E_DIVBYZERO                 ";
-        case TYPE_E_BUFFERTOOSMALL            :
-            return "TYPE_E_BUFFERTOOSMALL            ";
-        case TYPE_E_FIELDNOTFOUND             :
-            return "TYPE_E_FIELDNOTFOUND             ";
-        case TYPE_E_INVDATAREAD               :
-            return "TYPE_E_INVDATAREAD               ";
-        case TYPE_E_UNSUPFORMAT               :
-            return "TYPE_E_UNSUPFORMAT               ";
-        case TYPE_E_REGISTRYACCESS            :
-            return "TYPE_E_REGISTRYACCESS            ";
-        case TYPE_E_LIBNOTREGISTERED          :
-            return "TYPE_E_LIBNOTREGISTERED          ";
-        case TYPE_E_UNDEFINEDTYPE             :
-            return "TYPE_E_UNDEFINEDTYPE             ";
-        case TYPE_E_QUALIFIEDNAMEDISALLOWED   :
-            return "TYPE_E_QUALIFIEDNAMEDISALLOWED   ";
-        case TYPE_E_INVALIDSTATE              :
-            return "TYPE_E_INVALIDSTATE              ";
-        case TYPE_E_WRONGTYPEKIND             :
-            return "TYPE_E_WRONGTYPEKIND             ";
-        case TYPE_E_ELEMENTNOTFOUND           :
-            return "TYPE_E_ELEMENTNOTFOUND           ";
-        case TYPE_E_AMBIGUOUSNAME             :
-            return "TYPE_E_AMBIGUOUSNAME             ";
-        case TYPE_E_NAMECONFLICT              :
-            return "TYPE_E_NAMECONFLICT              ";
-        case TYPE_E_UNKNOWNLCID               :
-            return "TYPE_E_UNKNOWNLCID               ";
-        case TYPE_E_DLLFUNCTIONNOTFOUND       :
-            return "TYPE_E_DLLFUNCTIONNOTFOUND       ";
-        case TYPE_E_BADMODULEKIND             :
-            return "TYPE_E_BADMODULEKIND             ";
-        case TYPE_E_SIZETOOBIG                :
-            return "TYPE_E_SIZETOOBIG                ";
-        case TYPE_E_DUPLICATEID               :
-            return "TYPE_E_DUPLICATEID               ";
-        case TYPE_E_INVALIDID                 :
-            return "TYPE_E_INVALIDID                 ";
-        case TYPE_E_TYPEMISMATCH              :
-            return "TYPE_E_TYPEMISMATCH              ";
-        case TYPE_E_OUTOFBOUNDS               :
-            return "TYPE_E_OUTOFBOUNDS               ";
-        case TYPE_E_IOERROR                   :
-            return "TYPE_E_IOERROR                   ";
-        case TYPE_E_CANTCREATETMPFILE         :
-            return "TYPE_E_CANTCREATETMPFILE         ";
-        case TYPE_E_CANTLOADLIBRARY           :
-            return "TYPE_E_CANTLOADLIBRARY           ";
-        case TYPE_E_INCONSISTENTPROPFUNCS     :
-            return "TYPE_E_INCONSISTENTPROPFUNCS     ";
-        case TYPE_E_CIRCULARTYPE              :
-            return "TYPE_E_CIRCULARTYPE              ";
-        case STG_E_INVALIDFUNCTION            :
-            return "STG_E_INVALIDFUNCTION            ";
-        case STG_E_FILENOTFOUND               :
-            return "STG_E_FILENOTFOUND               ";
-        case STG_E_PATHNOTFOUND               :
-            return "STG_E_PATHNOTFOUND               ";
-        case STG_E_TOOMANYOPENFILES           :
-            return "STG_E_TOOMANYOPENFILES           ";
-        case STG_E_ACCESSDENIED               :
-            return "STG_E_ACCESSDENIED               ";
-        case STG_E_INVALIDHANDLE              :
-            return "STG_E_INVALIDHANDLE              ";
-        case STG_E_INSUFFICIENTMEMORY         :
-            return "STG_E_INSUFFICIENTMEMORY         ";
-        case STG_E_INVALIDPOINTER             :
-            return "STG_E_INVALIDPOINTER             ";
-        case STG_E_NOMOREFILES                :
-            return "STG_E_NOMOREFILES                ";
-        case STG_E_DISKISWRITEPROTECTED       :
-            return "STG_E_DISKISWRITEPROTECTED       ";
-        case STG_E_SEEKERROR                  :
-            return "STG_E_SEEKERROR                  ";
-        case STG_E_WRITEFAULT                 :
-            return "STG_E_WRITEFAULT                 ";
-        case STG_E_READFAULT                  :
-            return "STG_E_READFAULT                  ";
-        case STG_E_SHAREVIOLATION             :
-            return "STG_E_SHAREVIOLATION             ";
-        case STG_E_LOCKVIOLATION              :
-            return "STG_E_LOCKVIOLATION              ";
-        case STG_E_FILEALREADYEXISTS          :
-            return "STG_E_FILEALREADYEXISTS          ";
-        case STG_E_INVALIDPARAMETER           :
-            return "STG_E_INVALIDPARAMETER           ";
-        case STG_E_MEDIUMFULL                 :
-            return "STG_E_MEDIUMFULL                 ";
-        case STG_E_PROPSETMISMATCHED          :
-            return "STG_E_PROPSETMISMATCHED          ";
-        case STG_E_ABNORMALAPIEXIT            :
-            return "STG_E_ABNORMALAPIEXIT            ";
-        case STG_E_INVALIDHEADER              :
-            return "STG_E_INVALIDHEADER              ";
-        case STG_E_INVALIDNAME                :
-            return "STG_E_INVALIDNAME                ";
-        case STG_E_UNKNOWN                    :
-            return "STG_E_UNKNOWN                    ";
-        case STG_E_UNIMPLEMENTEDFUNCTION      :
-            return "STG_E_UNIMPLEMENTEDFUNCTION      ";
-        case STG_E_INVALIDFLAG                :
-            return "STG_E_INVALIDFLAG                ";
-        case STG_E_INUSE                      :
-            return "STG_E_INUSE                      ";
-        case STG_E_NOTCURRENT                 :
-            return "STG_E_NOTCURRENT                 ";
-        case STG_E_REVERTED                   :
-            return "STG_E_REVERTED                   ";
-        case STG_E_CANTSAVE                   :
-            return "STG_E_CANTSAVE                   ";
-        case STG_E_OLDFORMAT                  :
-            return "STG_E_OLDFORMAT                  ";
-        case STG_E_OLDDLL                     :
-            return "STG_E_OLDDLL                     ";
-        case STG_E_SHAREREQUIRED              :
-            return "STG_E_SHAREREQUIRED              ";
-        case STG_E_NOTFILEBASEDSTORAGE        :
-            return "STG_E_NOTFILEBASEDSTORAGE        ";
-        case STG_E_EXTANTMARSHALLINGS         :
-            return "STG_E_EXTANTMARSHALLINGS         ";
-        case STG_E_DOCFILECORRUPT             :
-            return "STG_E_DOCFILECORRUPT             ";
-        case STG_E_BADBASEADDRESS             :
-            return "STG_E_BADBASEADDRESS             ";
-        case STG_E_INCOMPLETE                 :
-            return "STG_E_INCOMPLETE                 ";
-        case STG_E_TERMINATED                 :
-            return "STG_E_TERMINATED                 ";
-        case STG_S_CONVERTED                  :
-            return "STG_S_CONVERTED                  ";
-        case STG_S_BLOCK                      :
-            return "STG_S_BLOCK                      ";
-        case STG_S_RETRYNOW                   :
-            return "STG_S_RETRYNOW                   ";
-        case STG_S_MONITORING                 :
-            return "STG_S_MONITORING                 ";
-        case STG_S_MULTIPLEOPENS              :
-            return "STG_S_MULTIPLEOPENS              ";
-        case STG_S_CONSOLIDATIONFAILED        :
-            return "STG_S_CONSOLIDATIONFAILED        ";
-        case STG_S_CANNOTCONSOLIDATE          :
-            return "STG_S_CANNOTCONSOLIDATE          ";
-        case RPC_E_CALL_REJECTED              :
-            return "RPC_E_CALL_REJECTED              ";
-        case RPC_E_CALL_CANCELED              :
-            return "RPC_E_CALL_CANCELED              ";
-        case RPC_E_CANTPOST_INSENDCALL        :
-            return "RPC_E_CANTPOST_INSENDCALL        ";
-        case RPC_E_CANTCALLOUT_INASYNCCALL    :
-            return "RPC_E_CANTCALLOUT_INASYNCCALL    ";
-        case RPC_E_CANTCALLOUT_INEXTERNALCALL :
-            return "RPC_E_CANTCALLOUT_INEXTERNALCALL ";
-        case RPC_E_CONNECTION_TERMINATED      :
-            return "RPC_E_CONNECTION_TERMINATED      ";
-        case RPC_E_SERVER_DIED                :
-            return "RPC_E_SERVER_DIED                ";
-        case RPC_E_CLIENT_DIED                :
-            return "RPC_E_CLIENT_DIED                ";
-        case RPC_E_INVALID_DATAPACKET         :
-            return "RPC_E_INVALID_DATAPACKET         ";
-        case RPC_E_CANTTRANSMIT_CALL          :
-            return "RPC_E_CANTTRANSMIT_CALL          ";
-        case RPC_E_CLIENT_CANTMARSHAL_DATA    :
-            return "RPC_E_CLIENT_CANTMARSHAL_DATA    ";
-        case RPC_E_CLIENT_CANTUNMARSHAL_DATA  :
-            return "RPC_E_CLIENT_CANTUNMARSHAL_DATA  ";
-        case RPC_E_SERVER_CANTMARSHAL_DATA    :
-            return "RPC_E_SERVER_CANTMARSHAL_DATA    ";
-        case RPC_E_SERVER_CANTUNMARSHAL_DATA  :
-            return "RPC_E_SERVER_CANTUNMARSHAL_DATA  ";
-        case RPC_E_INVALID_DATA               :
-            return "RPC_E_INVALID_DATA               ";
-        case RPC_E_INVALID_PARAMETER          :
-            return "RPC_E_INVALID_PARAMETER          ";
-        case RPC_E_CANTCALLOUT_AGAIN          :
-            return "RPC_E_CANTCALLOUT_AGAIN          ";
-        case RPC_E_SERVER_DIED_DNE            :
-            return "RPC_E_SERVER_DIED_DNE            ";
-        case RPC_E_SYS_CALL_FAILED            :
-            return "RPC_E_SYS_CALL_FAILED            ";
-        case RPC_E_OUT_OF_RESOURCES           :
-            return "RPC_E_OUT_OF_RESOURCES           ";
-        case RPC_E_ATTEMPTED_MULTITHREAD      :
-            return "RPC_E_ATTEMPTED_MULTITHREAD      ";
-        case RPC_E_NOT_REGISTERED             :
-            return "RPC_E_NOT_REGISTERED             ";
-        case RPC_E_FAULT                      :
-            return "RPC_E_FAULT                      ";
-        case RPC_E_SERVERFAULT                :
-            return "RPC_E_SERVERFAULT                ";
-        case RPC_E_CHANGED_MODE               :
-            return "RPC_E_CHANGED_MODE               ";
-        case RPC_E_INVALIDMETHOD              :
-            return "RPC_E_INVALIDMETHOD              ";
-        case RPC_E_DISCONNECTED               :
-            return "RPC_E_DISCONNECTED               ";
-        case RPC_E_RETRY                      :
-            return "RPC_E_RETRY                      ";
-        case RPC_E_SERVERCALL_RETRYLATER      :
-            return "RPC_E_SERVERCALL_RETRYLATER      ";
-        case RPC_E_SERVERCALL_REJECTED        :
-            return "RPC_E_SERVERCALL_REJECTED        ";
-        case RPC_E_INVALID_CALLDATA           :
-            return "RPC_E_INVALID_CALLDATA           ";
-        case RPC_E_CANTCALLOUT_ININPUTSYNCCALL :
-            return "RPC_E_CANTCALLOUT_ININPUTSYNCCALL ";
-        case RPC_E_WRONG_THREAD               :
-            return "RPC_E_WRONG_THREAD               ";
-        case RPC_E_THREAD_NOT_INIT            :
-            return "RPC_E_THREAD_NOT_INIT            ";
-        case RPC_E_VERSION_MISMATCH           :
-            return "RPC_E_VERSION_MISMATCH           ";
-        case RPC_E_INVALID_HEADER             :
-            return "RPC_E_INVALID_HEADER             ";
-        case RPC_E_INVALID_EXTENSION          :
-            return "RPC_E_INVALID_EXTENSION          ";
-        case RPC_E_INVALID_IPID               :
-            return "RPC_E_INVALID_IPID               ";
-        case RPC_E_INVALID_OBJECT             :
-            return "RPC_E_INVALID_OBJECT             ";
-        case RPC_S_CALLPENDING                :
-            return "RPC_S_CALLPENDING                ";
-        case RPC_S_WAITONTIMER                :
-            return "RPC_S_WAITONTIMER                ";
-        case RPC_E_CALL_COMPLETE              :
-            return "RPC_E_CALL_COMPLETE              ";
-        case RPC_E_UNSECURE_CALL              :
-            return "RPC_E_UNSECURE_CALL              ";
-        case RPC_E_TOO_LATE                   :
-            return "RPC_E_TOO_LATE                   ";
-        case RPC_E_NO_GOOD_SECURITY_PACKAGES  :
-            return "RPC_E_NO_GOOD_SECURITY_PACKAGES  ";
-        case RPC_E_ACCESS_DENIED              :
-            return "RPC_E_ACCESS_DENIED              ";
-        case RPC_E_REMOTE_DISABLED            :
-            return "RPC_E_REMOTE_DISABLED            ";
-        case RPC_E_INVALID_OBJREF             :
-            return "RPC_E_INVALID_OBJREF             ";
-        case RPC_E_NO_CONTEXT                 :
-            return "RPC_E_NO_CONTEXT                 ";
-        case RPC_E_TIMEOUT                    :
-            return "RPC_E_TIMEOUT                    ";
-        case RPC_E_NO_SYNC                    :
-            return "RPC_E_NO_SYNC                    ";
-        case RPC_E_UNEXPECTED                 :
-            return "RPC_E_UNEXPECTED                 ";
-        case NTE_BAD_UID                      :
-            return "NTE_BAD_UID                      ";
-        case NTE_BAD_HASH                     :
-            return "NTE_BAD_HASH                     ";
-    //case NTE_BAD_HASH                     :
-    //return "NTE_BAD_HASH                     ";
-        case NTE_BAD_KEY                      :
-            return "NTE_BAD_KEY                      ";
-        case NTE_BAD_LEN                      :
-            return "NTE_BAD_LEN                      ";
-        case NTE_BAD_DATA                     :
-            return "NTE_BAD_DATA                     ";
-        case NTE_BAD_SIGNATURE                :
-            return "NTE_BAD_SIGNATURE                ";
-        case NTE_BAD_VER                      :
-            return "NTE_BAD_VER                      ";
-        case NTE_BAD_ALGID                    :
-            return "NTE_BAD_ALGID                    ";
-        case NTE_BAD_FLAGS                    :
-            return "NTE_BAD_FLAGS                    ";
-        case NTE_BAD_TYPE                     :
-            return "NTE_BAD_TYPE                     ";
-        case NTE_BAD_KEY_STATE                :
-            return "NTE_BAD_KEY_STATE                ";
-        case NTE_BAD_HASH_STATE               :
-            return "NTE_BAD_HASH_STATE               ";
-        case NTE_NO_KEY                       :
-            return "NTE_NO_KEY                       ";
-        case NTE_NO_MEMORY                    :
-            return "NTE_NO_MEMORY                    ";
-        case NTE_EXISTS                       :
-            return "NTE_EXISTS                       ";
-        case NTE_PERM                         :
-            return "NTE_PERM                         ";
-        case NTE_NOT_FOUND                    :
-            return "NTE_NOT_FOUND                    ";
-        case NTE_DOUBLE_ENCRYPT               :
-            return "NTE_DOUBLE_ENCRYPT               ";
-        case NTE_BAD_PROVIDER                 :
-            return "NTE_BAD_PROVIDER                 ";
-        case NTE_BAD_PROV_TYPE                :
-            return "NTE_BAD_PROV_TYPE                ";
-        case NTE_BAD_PUBLIC_KEY               :
-            return "NTE_BAD_PUBLIC_KEY               ";
-        case NTE_BAD_KEYSET                   :
-            return "NTE_BAD_KEYSET                   ";
-        case NTE_PROV_TYPE_NOT_DEF            :
-            return "NTE_PROV_TYPE_NOT_DEF            ";
-        case NTE_PROV_TYPE_ENTRY_BAD          :
-            return "NTE_PROV_TYPE_ENTRY_BAD          ";
-        case NTE_KEYSET_NOT_DEF               :
-            return "NTE_KEYSET_NOT_DEF               ";
-        case NTE_KEYSET_ENTRY_BAD             :
-            return "NTE_KEYSET_ENTRY_BAD             ";
-        case NTE_PROV_TYPE_NO_MATCH           :
-            return "NTE_PROV_TYPE_NO_MATCH           ";
-        case NTE_SIGNATURE_FILE_BAD           :
-            return "NTE_SIGNATURE_FILE_BAD           ";
-        case NTE_PROVIDER_DLL_FAIL            :
-            return "NTE_PROVIDER_DLL_FAIL            ";
-        case NTE_PROV_DLL_NOT_FOUND           :
-            return "NTE_PROV_DLL_NOT_FOUND           ";
-        case NTE_BAD_KEYSET_PARAM             :
-            return "NTE_BAD_KEYSET_PARAM             ";
-        case NTE_FAIL                         :
-            return "NTE_FAIL                         ";
-        case NTE_SYS_ERR                      :
-            return "NTE_SYS_ERR                      ";
-        case CRYPT_E_MSG_ERROR                :
-            return "CRYPT_E_MSG_ERROR                ";
-        case CRYPT_E_UNKNOWN_ALGO             :
-            return "CRYPT_E_UNKNOWN_ALGO             ";
-        case CRYPT_E_OID_FORMAT               :
-            return "CRYPT_E_OID_FORMAT               ";
-        case CRYPT_E_INVALID_MSG_TYPE         :
-            return "CRYPT_E_INVALID_MSG_TYPE         ";
-        case CRYPT_E_UNEXPECTED_ENCODING      :
-            return "CRYPT_E_UNEXPECTED_ENCODING      ";
-        case CRYPT_E_AUTH_ATTR_MISSING        :
-            return "CRYPT_E_AUTH_ATTR_MISSING        ";
-        case CRYPT_E_HASH_VALUE               :
-            return "CRYPT_E_HASH_VALUE               ";
-        case CRYPT_E_INVALID_INDEX            :
-            return "CRYPT_E_INVALID_INDEX            ";
-        case CRYPT_E_ALREADY_DECRYPTED        :
-            return "CRYPT_E_ALREADY_DECRYPTED        ";
-        case CRYPT_E_NOT_DECRYPTED            :
-            return "CRYPT_E_NOT_DECRYPTED            ";
-        case CRYPT_E_RECIPIENT_NOT_FOUND      :
-            return "CRYPT_E_RECIPIENT_NOT_FOUND      ";
-        case CRYPT_E_CONTROL_TYPE             :
-            return "CRYPT_E_CONTROL_TYPE             ";
-        case CRYPT_E_ISSUER_SERIALNUMBER      :
-            return "CRYPT_E_ISSUER_SERIALNUMBER      ";
-        case CRYPT_E_SIGNER_NOT_FOUND         :
-            return "CRYPT_E_SIGNER_NOT_FOUND         ";
-        case CRYPT_E_ATTRIBUTES_MISSING       :
-            return "CRYPT_E_ATTRIBUTES_MISSING       ";
-        case CRYPT_E_STREAM_MSG_NOT_READY     :
-            return "CRYPT_E_STREAM_MSG_NOT_READY     ";
-        case CRYPT_E_STREAM_INSUFFICIENT_DATA :
-            return "CRYPT_E_STREAM_INSUFFICIENT_DATA ";
-        case CRYPT_E_BAD_LEN                  :
-            return "CRYPT_E_BAD_LEN                  ";
-        case CRYPT_E_BAD_ENCODE               :
-            return "CRYPT_E_BAD_ENCODE               ";
-        case CRYPT_E_FILE_ERROR               :
-            return "CRYPT_E_FILE_ERROR               ";
-        case CRYPT_E_NOT_FOUND                :
-            return "CRYPT_E_NOT_FOUND                ";
-        case CRYPT_E_EXISTS                   :
-            return "CRYPT_E_EXISTS                   ";
-        case CRYPT_E_NO_PROVIDER              :
-            return "CRYPT_E_NO_PROVIDER              ";
-        case CRYPT_E_SELF_SIGNED              :
-            return "CRYPT_E_SELF_SIGNED              ";
-        case CRYPT_E_DELETED_PREV             :
-            return "CRYPT_E_DELETED_PREV             ";
-        case CRYPT_E_NO_MATCH                 :
-            return "CRYPT_E_NO_MATCH                 ";
-        case CRYPT_E_UNEXPECTED_MSG_TYPE      :
-            return "CRYPT_E_UNEXPECTED_MSG_TYPE      ";
-        case CRYPT_E_NO_KEY_PROPERTY          :
-            return "CRYPT_E_NO_KEY_PROPERTY          ";
-        case CRYPT_E_NO_DECRYPT_CERT          :
-            return "CRYPT_E_NO_DECRYPT_CERT          ";
-        case CRYPT_E_BAD_MSG                  :
-            return "CRYPT_E_BAD_MSG                  ";
-        case CRYPT_E_NO_SIGNER                :
-            return "CRYPT_E_NO_SIGNER                ";
-        case CRYPT_E_PENDING_CLOSE            :
-            return "CRYPT_E_PENDING_CLOSE            ";
-        case CRYPT_E_REVOKED                  :
-            return "CRYPT_E_REVOKED                  ";
-        case CRYPT_E_NO_REVOCATION_DLL        :
-            return "CRYPT_E_NO_REVOCATION_DLL        ";
-        case CRYPT_E_NO_REVOCATION_CHECK      :
-            return "CRYPT_E_NO_REVOCATION_CHECK      ";
-        case CRYPT_E_REVOCATION_OFFLINE       :
-            return "CRYPT_E_REVOCATION_OFFLINE       ";
-        case CRYPT_E_NOT_IN_REVOCATION_DATABASE :
-            return "CRYPT_E_NOT_IN_REVOCATION_DATABASE ";
-        case CRYPT_E_INVALID_NUMERIC_STRING   :
-            return "CRYPT_E_INVALID_NUMERIC_STRING   ";
-        case CRYPT_E_INVALID_PRINTABLE_STRING :
-            return "CRYPT_E_INVALID_PRINTABLE_STRING ";
-        case CRYPT_E_INVALID_IA5_STRING       :
-            return "CRYPT_E_INVALID_IA5_STRING       ";
-        case CRYPT_E_INVALID_X500_STRING      :
-            return "CRYPT_E_INVALID_X500_STRING      ";
-        case CRYPT_E_NOT_CHAR_STRING          :
-            return "CRYPT_E_NOT_CHAR_STRING          ";
-        case CRYPT_E_FILERESIZED              :
-            return "CRYPT_E_FILERESIZED              ";
-        case CRYPT_E_SECURITY_SETTINGS        :
-            return "CRYPT_E_SECURITY_SETTINGS        ";
-        case CRYPT_E_NO_VERIFY_USAGE_DLL      :
-            return "CRYPT_E_NO_VERIFY_USAGE_DLL      ";
-        case CRYPT_E_NO_VERIFY_USAGE_CHECK    :
-            return "CRYPT_E_NO_VERIFY_USAGE_CHECK    ";
-        case CRYPT_E_VERIFY_USAGE_OFFLINE     :
-            return "CRYPT_E_VERIFY_USAGE_OFFLINE     ";
-        case CRYPT_E_NOT_IN_CTL               :
-            return "CRYPT_E_NOT_IN_CTL               ";
-        case CRYPT_E_NO_TRUSTED_SIGNER        :
-            return "CRYPT_E_NO_TRUSTED_SIGNER        ";
-        case CRYPT_E_OSS_ERROR                :
-            return "CRYPT_E_OSS_ERROR                ";
-        case CERTSRV_E_BAD_REQUESTSUBJECT     :
-            return "CERTSRV_E_BAD_REQUESTSUBJECT     ";
-        case CERTSRV_E_NO_REQUEST             :
-            return "CERTSRV_E_NO_REQUEST             ";
-        case CERTSRV_E_BAD_REQUESTSTATUS      :
-            return "CERTSRV_E_BAD_REQUESTSTATUS      ";
-        case CERTSRV_E_PROPERTY_EMPTY         :
-            return "CERTSRV_E_PROPERTY_EMPTY         ";
-    //case CERTDB_E_JET_ERROR               :
-    //return "CERTDB_E_JET_ERROR               ";
-        case TRUST_E_SYSTEM_ERROR             :
-            return "TRUST_E_SYSTEM_ERROR             ";
-        case TRUST_E_NO_SIGNER_CERT           :
-            return "TRUST_E_NO_SIGNER_CERT           ";
-        case TRUST_E_COUNTER_SIGNER           :
-            return "TRUST_E_COUNTER_SIGNER           ";
-        case TRUST_E_CERT_SIGNATURE           :
-            return "TRUST_E_CERT_SIGNATURE           ";
-        case TRUST_E_TIME_STAMP               :
-            return "TRUST_E_TIME_STAMP               ";
-        case TRUST_E_BAD_DIGEST               :
-            return "TRUST_E_BAD_DIGEST               ";
-        case TRUST_E_BASIC_CONSTRAINTS        :
-            return "TRUST_E_BASIC_CONSTRAINTS        ";
-        case TRUST_E_FINANCIAL_CRITERIA       :
-            return "TRUST_E_FINANCIAL_CRITERIA       ";
-        case TRUST_E_PROVIDER_UNKNOWN         :
-            return "TRUST_E_PROVIDER_UNKNOWN         ";
-        case TRUST_E_ACTION_UNKNOWN           :
-            return "TRUST_E_ACTION_UNKNOWN           ";
-        case TRUST_E_SUBJECT_FORM_UNKNOWN     :
-            return "TRUST_E_SUBJECT_FORM_UNKNOWN     ";
-        case TRUST_E_SUBJECT_NOT_TRUSTED      :
-            return "TRUST_E_SUBJECT_NOT_TRUSTED      ";
-        case DIGSIG_E_ENCODE                  :
-            return "DIGSIG_E_ENCODE                  ";
-        case DIGSIG_E_DECODE                  :
-            return "DIGSIG_E_DECODE                  ";
-        case DIGSIG_E_EXTENSIBILITY           :
-            return "DIGSIG_E_EXTENSIBILITY           ";
-        case DIGSIG_E_CRYPTO                  :
-            return "DIGSIG_E_CRYPTO                  ";
-        case PERSIST_E_SIZEDEFINITE           :
-            return "PERSIST_E_SIZEDEFINITE           ";
-        case PERSIST_E_SIZEINDEFINITE         :
-            return "PERSIST_E_SIZEINDEFINITE         ";
-        case PERSIST_E_NOTSELFSIZING          :
-            return "PERSIST_E_NOTSELFSIZING          ";
-        case TRUST_E_NOSIGNATURE              :
-            return "TRUST_E_NOSIGNATURE              ";
-        case CERT_E_EXPIRED                   :
-            return "CERT_E_EXPIRED                   ";
-        case CERT_E_VALIDITYPERIODNESTING     :
-            return "CERT_E_VALIDITYPERIODNESTING     ";
-        case CERT_E_ROLE                      :
-            return "CERT_E_ROLE                      ";
-        case CERT_E_PATHLENCONST              :
-            return "CERT_E_PATHLENCONST              ";
-        case CERT_E_CRITICAL                  :
-            return "CERT_E_CRITICAL                  ";
-        case CERT_E_PURPOSE                   :
-            return "CERT_E_PURPOSE                   ";
-        case CERT_E_ISSUERCHAINING            :
-            return "CERT_E_ISSUERCHAINING            ";
-        case CERT_E_MALFORMED                 :
-            return "CERT_E_MALFORMED                 ";
-        case CERT_E_UNTRUSTEDROOT             :
-            return "CERT_E_UNTRUSTEDROOT             ";
-        case CERT_E_CHAINING                  :
-            return "CERT_E_CHAINING                  ";
-        case TRUST_E_FAIL                     :
-            return "TRUST_E_FAIL                     ";
-        case CERT_E_REVOKED                   :
-            return "CERT_E_REVOKED                   ";
-        case CERT_E_UNTRUSTEDTESTROOT         :
-            return "CERT_E_UNTRUSTEDTESTROOT         ";
-        case CERT_E_REVOCATION_FAILURE        :
-            return "CERT_E_REVOCATION_FAILURE        ";
-        case CERT_E_CN_NO_MATCH               :
-            return "CERT_E_CN_NO_MATCH               ";
-        case CERT_E_WRONG_USAGE               :
-            return "CERT_E_WRONG_USAGE               ";
-        case SPAPI_E_EXPECTED_SECTION_NAME    :
-            return "SPAPI_E_EXPECTED_SECTION_NAME    ";
-        case SPAPI_E_BAD_SECTION_NAME_LINE    :
-            return "SPAPI_E_BAD_SECTION_NAME_LINE    ";
-        case SPAPI_E_SECTION_NAME_TOO_LONG    :
-            return "SPAPI_E_SECTION_NAME_TOO_LONG    ";
-        case SPAPI_E_GENERAL_SYNTAX           :
-            return "SPAPI_E_GENERAL_SYNTAX           ";
-        case SPAPI_E_WRONG_INF_STYLE          :
-            return "SPAPI_E_WRONG_INF_STYLE          ";
-        case SPAPI_E_SECTION_NOT_FOUND        :
-            return "SPAPI_E_SECTION_NOT_FOUND        ";
-        case SPAPI_E_LINE_NOT_FOUND           :
-            return "SPAPI_E_LINE_NOT_FOUND           ";
-        case SPAPI_E_NO_ASSOCIATED_CLASS      :
-            return "SPAPI_E_NO_ASSOCIATED_CLASS      ";
-        case SPAPI_E_CLASS_MISMATCH           :
-            return "SPAPI_E_CLASS_MISMATCH           ";
-        case SPAPI_E_DUPLICATE_FOUND          :
-            return "SPAPI_E_DUPLICATE_FOUND          ";
-        case SPAPI_E_NO_DRIVER_SELECTED       :
-            return "SPAPI_E_NO_DRIVER_SELECTED       ";
-        case SPAPI_E_KEY_DOES_NOT_EXIST       :
-            return "SPAPI_E_KEY_DOES_NOT_EXIST       ";
-        case SPAPI_E_INVALID_DEVINST_NAME     :
-            return "SPAPI_E_INVALID_DEVINST_NAME     ";
-        case SPAPI_E_INVALID_CLASS            :
-            return "SPAPI_E_INVALID_CLASS            ";
-        case SPAPI_E_DEVINST_ALREADY_EXISTS   :
-            return "SPAPI_E_DEVINST_ALREADY_EXISTS   ";
-        case SPAPI_E_DEVINFO_NOT_REGISTERED   :
-            return "SPAPI_E_DEVINFO_NOT_REGISTERED   ";
-        case SPAPI_E_INVALID_REG_PROPERTY     :
-            return "SPAPI_E_INVALID_REG_PROPERTY     ";
-        case SPAPI_E_NO_INF                   :
-            return "SPAPI_E_NO_INF                   ";
-        case SPAPI_E_NO_SUCH_DEVINST          :
-            return "SPAPI_E_NO_SUCH_DEVINST          ";
-        case SPAPI_E_CANT_LOAD_CLASS_ICON     :
-            return "SPAPI_E_CANT_LOAD_CLASS_ICON     ";
-        case SPAPI_E_INVALID_CLASS_INSTALLER  :
-            return "SPAPI_E_INVALID_CLASS_INSTALLER  ";
-        case SPAPI_E_DI_DO_DEFAULT            :
-            return "SPAPI_E_DI_DO_DEFAULT            ";
-        case SPAPI_E_DI_NOFILECOPY            :
-            return "SPAPI_E_DI_NOFILECOPY            ";
-        case SPAPI_E_INVALID_HWPROFILE        :
-            return "SPAPI_E_INVALID_HWPROFILE        ";
-        case SPAPI_E_NO_DEVICE_SELECTED       :
-            return "SPAPI_E_NO_DEVICE_SELECTED       ";
-        case SPAPI_E_DEVINFO_LIST_LOCKED      :
-            return "SPAPI_E_DEVINFO_LIST_LOCKED      ";
-        case SPAPI_E_DEVINFO_DATA_LOCKED      :
-            return "SPAPI_E_DEVINFO_DATA_LOCKED      ";
-        case SPAPI_E_DI_BAD_PATH              :
-            return "SPAPI_E_DI_BAD_PATH              ";
-        case SPAPI_E_NO_CLASSINSTALL_PARAMS   :
-            return "SPAPI_E_NO_CLASSINSTALL_PARAMS   ";
-        case SPAPI_E_FILEQUEUE_LOCKED         :
-            return "SPAPI_E_FILEQUEUE_LOCKED         ";
-        case SPAPI_E_BAD_SERVICE_INSTALLSECT  :
-            return "SPAPI_E_BAD_SERVICE_INSTALLSECT  ";
-        case SPAPI_E_NO_CLASS_DRIVER_LIST     :
-            return "SPAPI_E_NO_CLASS_DRIVER_LIST     ";
-        case SPAPI_E_NO_ASSOCIATED_SERVICE    :
-            return "SPAPI_E_NO_ASSOCIATED_SERVICE    ";
-        case SPAPI_E_NO_DEFAULT_DEVICE_INTERFACE :
-            return "SPAPI_E_NO_DEFAULT_DEVICE_INTERFACE ";
-        case SPAPI_E_DEVICE_INTERFACE_ACTIVE  :
-            return "SPAPI_E_DEVICE_INTERFACE_ACTIVE  ";
-        case SPAPI_E_DEVICE_INTERFACE_REMOVED :
-            return "SPAPI_E_DEVICE_INTERFACE_REMOVED ";
-        case SPAPI_E_BAD_INTERFACE_INSTALLSECT :
-            return "SPAPI_E_BAD_INTERFACE_INSTALLSECT ";
-        case SPAPI_E_NO_SUCH_INTERFACE_CLASS  :
-            return "SPAPI_E_NO_SUCH_INTERFACE_CLASS  ";
-        case SPAPI_E_INVALID_REFERENCE_STRING :
-            return "SPAPI_E_INVALID_REFERENCE_STRING ";
-        case SPAPI_E_INVALID_MACHINENAME      :
-            return "SPAPI_E_INVALID_MACHINENAME      ";
-        case SPAPI_E_REMOTE_COMM_FAILURE      :
-            return "SPAPI_E_REMOTE_COMM_FAILURE      ";
-        case SPAPI_E_MACHINE_UNAVAILABLE      :
-            return "SPAPI_E_MACHINE_UNAVAILABLE      ";
-        case SPAPI_E_NO_CONFIGMGR_SERVICES    :
-            return "SPAPI_E_NO_CONFIGMGR_SERVICES    ";
-        case SPAPI_E_INVALID_PROPPAGE_PROVIDER :
-            return "SPAPI_E_INVALID_PROPPAGE_PROVIDER ";
-        case SPAPI_E_NO_SUCH_DEVICE_INTERFACE :
-            return "SPAPI_E_NO_SUCH_DEVICE_INTERFACE ";
-        case SPAPI_E_DI_POSTPROCESSING_REQUIRED :
-            return "SPAPI_E_DI_POSTPROCESSING_REQUIRED ";
-        case SPAPI_E_INVALID_COINSTALLER      :
-            return "SPAPI_E_INVALID_COINSTALLER      ";
-        case SPAPI_E_NO_COMPAT_DRIVERS        :
-            return "SPAPI_E_NO_COMPAT_DRIVERS        ";
-        case SPAPI_E_NO_DEVICE_ICON           :
-            return "SPAPI_E_NO_DEVICE_ICON           ";
-        case SPAPI_E_INVALID_INF_LOGCONFIG    :
-            return "SPAPI_E_INVALID_INF_LOGCONFIG    ";
-        case SPAPI_E_DI_DONT_INSTALL          :
-            return "SPAPI_E_DI_DONT_INSTALL          ";
-        case SPAPI_E_INVALID_FILTER_DRIVER    :
-            return "SPAPI_E_INVALID_FILTER_DRIVER    ";
-        case SPAPI_E_ERROR_NOT_INSTALLED      :
-            return "SPAPI_E_ERROR_NOT_INSTALLED      ";
-
-        default:
-            static char buff[1000];
-            sprintf(buff, "Unrecognized error value: %08X\0", error);
-
-            return buff;
-    }
-}
-
-// Global system parameters we want to modify during our run
-static int iMouseTrails;
-static bool bCursorShadowOn,bMouseVanish;
-
-void set_global_parameters() {
-  // turn off mousetrails and cursor shadow and mouse cursor vanish
-  // cursor shadow causes cursor blink and reduced frame rate due to lack of driver support for
-  // cursor alpha blending
-
-  // this is a win2k/xp only param, could use GetVersionEx to do it just for win2k,
-  // but since it is just a param it will just cause a silent error on other OS's
-  // that should be ok
-  SystemParametersInfo(SPI_GETCURSORSHADOW,NULL,&bCursorShadowOn,NULL);
-  SystemParametersInfo(SPI_SETCURSORSHADOW,NULL,(PVOID)false,NULL);
-
-  SystemParametersInfo(SPI_GETMOUSETRAILS,NULL,&iMouseTrails,NULL);
-  SystemParametersInfo(SPI_SETMOUSETRAILS,NULL,(PVOID)0,NULL);
-
-  // this is ME/XP only feature
-  SystemParametersInfo(SPI_GETMOUSEVANISH,NULL,&bMouseVanish,NULL);
-  SystemParametersInfo(SPI_SETMOUSEVANISH,NULL,(PVOID)false,NULL);
-}
-
-void restore_global_parameters() {
-  SystemParametersInfo(SPI_SETCURSORSHADOW,NULL,(PVOID)bCursorShadowOn,NULL);
-  SystemParametersInfo(SPI_SETMOUSETRAILS,NULL,(PVOID)iMouseTrails,NULL);
-  SystemParametersInfo(SPI_SETMOUSEVANISH,NULL,(PVOID)bMouseVanish,NULL);
-}
-

+ 0 - 158
panda/src/wgldisplay/wglGraphicsWindow.h.old

@@ -1,158 +0,0 @@
-// Filename: wglGraphicsWindow.h
-// Created by:  mike (09Jan97)
-//
-////////////////////////////////////////////////////////////////////
-//
-// PANDA 3D SOFTWARE
-// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
-//
-// All use of this software is subject to the terms of the Panda 3d
-// Software license.  You should have received a copy of this license
-// along with this source code; you will also find a current copy of
-// the license at http://www.panda3d.org/license.txt .
-//
-// To contact the maintainers of this program write to
-// [email protected] .
-//
-////////////////////////////////////////////////////////////////////
-#ifndef WGLGRAPHICSWINDOW_H
-#define WGLGRAPHICSWINDOW_H
-//
-////////////////////////////////////////////////////////////////////
-// Includes
-////////////////////////////////////////////////////////////////////
-
-// include win32 defns for everything up to XP, and assume I'm smart enough to
-// use GetProcAddress for backward compat on w95/w98 for newer fns
-#define _WIN32_WINNT 0x0501
-
-#define WINDOWS_LEAN_AND_MEAN
-#include <windows.h>
-#undef WINDOWS_LEAN_AND_MEAN
-
-#include <pandabase.h>
-#include <graphicsWindow.h>
-
-////////////////////////////////////////////////////////////////////
-// Defines
-////////////////////////////////////////////////////////////////////
-class wglGraphicsPipe;
-
-#if 0
-#define GLX_USE_GL              1       /* support GLX rendering */
-#define GLX_BUFFER_SIZE         2       /* depth of the color buffer */
-#define GLX_LEVEL               3       /* level in plane stacking */
-#define GLX_RGBA                4       /* true if RGBA mode */
-#define GLX_DOUBLEBUFFER        5       /* double buffering supported */
-#define GLX_STEREO              6       /* stereo buffering supported */
-#define GLX_AUX_BUFFERS         7       /* number of aux buffers */
-#define GLX_RED_SIZE            8       /* number of red component bits */
-#define GLX_GREEN_SIZE          9       /* number of green component bits */
-#define GLX_BLUE_SIZE           10      /* number of blue component bits */
-#define GLX_ALPHA_SIZE          11      /* number of alpha component bits */
-#define GLX_DEPTH_SIZE          12      /* number of depth bits */
-#define GLX_STENCIL_SIZE        13      /* number of stencil bits */
-#define GLX_ACCUM_RED_SIZE      14      /* number of red accum bits */
-#define GLX_ACCUM_GREEN_SIZE    15      /* number of green accum bits */
-#define GLX_ACCUM_BLUE_SIZE     16      /* number of blue accum bits */
-#define GLX_ACCUM_ALPHA_SIZE    17      /* number of alpha accum bits */
-#endif
-
-////////////////////////////////////////////////////////////////////
-//       Class : wglGraphicsWindow
-// Description :
-////////////////////////////////////////////////////////////////////
-class EXPCL_PANDAGL wglGraphicsWindow : public GraphicsWindow {
-public:
-  wglGraphicsWindow(GraphicsPipe* pipe);
-  wglGraphicsWindow(GraphicsPipe* pipe,
-             const GraphicsWindow::Properties& props);
-  virtual ~wglGraphicsWindow();
-
-  virtual void end_frame();
-  virtual void swap();
-  virtual int get_depth_bitwidth();
-
-  virtual TypeHandle get_gsg_type() const;
-  static GraphicsWindow* make_wglGraphicsWindow(const FactoryParams &params);
-
-public:
-  virtual void make_current();
-  virtual void unmake_current();
-  void handle_mouse_motion(int x, int y);
-  void handle_mouse_exit(void);
-  INLINE void track_mouse_leaving(HWND hwnd);
-  void handle_keypress(ButtonHandle key, int x, int y);
-  void handle_keyrelease(ButtonHandle key);
-
-protected:
-  int choose_visual(void);
-  int find_pixfmtnum(bool bLookforHW);
-  virtual void config();
-  void setup_colormap(void);
-  void handle_reshape();
-  void process_events();
-
-public:
-  HWND              _mwindow;
-
-private:
-  HGLRC             _context;
-  HDC               _hdc;
-  PIXELFORMATDESCRIPTOR  _pixelformat;
-  HPALETTE          _colormap;
-  HCURSOR           _hMouseCursor;
-  HWND              _hOldForegroundWindow;
-  UINT_PTR          _PandaPausedTimer;
-
-  DEVMODE           *_pCurrent_display_settings;
-  bool              _bIsLowVidMemCard;
-  bool              _bLoadedCustomCursor;
-
-  bool              _active_minimized_fullscreen;
-  bool              _return_control_to_app;
-  bool              _exiting_window;
-  bool              _cursor_in_windowclientarea;
-  bool              _tracking_mouse_leaving;
-  bool              _ime_open;
-  bool              _ime_active;
-  bool              _ime_composition_w;
-
-  // vars for frames/sec meter
-  DWORD _start_time;
-  DWORD _start_frame_count;
-  DWORD _cur_frame_count;
-  float _current_fps;
-
-  string _extensions_str;
-
-  typedef BOOL (WINAPI* PFN_TRACKMOUSEEVENT)(LPTRACKMOUSEEVENT);
-  PFN_TRACKMOUSEEVENT _pfnTrackMouseEvent;
-
-public:
-  static TypeHandle get_class_type();
-  static void init_type();
-  virtual TypeHandle get_type() const;
-  virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
-
-  LONG WINAPI window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
-  ButtonHandle lookup_key(WPARAM wparam) const;
-  void DestroyMe(bool bAtExitFnCalled);
-  virtual void deactivate_window();
-  virtual void reactivate_window();
-
-  virtual bool resize(unsigned int xsize,unsigned int ysize);
-  virtual unsigned int verify_window_sizes(unsigned int numsizes,unsigned int *dimen);
-
-protected:
-  virtual void do_close_window();
-  void check_for_color_cursor_support();
-
-private:
-  static TypeHandle _type_handle;
-};
-
-extern void set_global_parameters();
-extern void restore_global_parameters();
-
-#endif