WINGDIAPI BOOL GLAPIENTRY wglMakeCurrent(HDC hdc, HGLRC hglrc) { int i; CurrentHDC = hdc; if (!hdc || !hglrc) { WMesaMakeCurrent(NULL, NULL); ctx_current = -1; return TRUE; } for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) { if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ) { WMesaMakeCurrent( (WMesaContext) hglrc, hdc ); ctx_current = i; return TRUE; } } return FALSE; }
WINGDIAPI BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc) { int i; for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) { if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ){ WMesaMakeCurrent((WMesaContext) hglrc, NULL); WMesaDestroyContext(wgl_ctx[i].ctx); wgl_ctx[i].ctx = NULL; ctx_count--; return(TRUE); } } SetLastError(0); return(FALSE); }
GLenum tkInitWindowAW(char *title, BOOL bUnicode) { WMesaContext Cur; WNDCLASS wndclass; RECT WinRect; HANDLE hInstance; ATOM aRegister; GLenum Result = GL_FALSE,RGB_Flag=GL_TRUE,DB_Flag=GL_FALSE; hInstance = GetModuleHandle(NULL); // Must not define CS_CS_PARENTDC style. wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = (WNDPROC)tkWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = GetStockObject(BLACK_BRUSH); wndclass.lpszMenuName = NULL; if (bUnicode) wndclass.lpszClassName = (LPCSTR)lpszClassNameW; else wndclass.lpszClassName = (LPCSTR)lpszClassName; if (bUnicode) { aRegister = RegisterClassW((CONST WNDCLASSW *)&wndclass); } else { aRegister = RegisterClass(&wndclass); } /* * If the window failed to register, then there's no * need to continue further. */ if(0 == aRegister) { PrintMessage("Failed to register window class\n"); return(Result); } /* * Make window large enough to hold a client area as large as windInfo */ WinRect.left = windInfo.x; WinRect.right = windInfo.x + windInfo.width; WinRect.top = windInfo.y; WinRect.bottom = windInfo.y + windInfo.height; AdjustWindowRect(&WinRect, WS_OVERLAPPEDWINDOW, FALSE); /* * Must use WS_CLIPCHILDREN and WS_CLIPSIBLINGS styles. */ if (bUnicode) { tkhwnd = CreateWindowW( (LPCWSTR)lpszClassNameW, (LPCWSTR)title, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, (windInfo.bDefPos) ? CW_USEDEFAULT : WinRect.left, (windInfo.bDefPos) ? CW_USEDEFAULT : WinRect.top, WinRect.right - WinRect.left, WinRect.bottom - WinRect.top, NULL, NULL, hInstance, NULL); } else { tkhwnd = CreateWindow( lpszClassName, title, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, (windInfo.bDefPos) ? CW_USEDEFAULT : WinRect.left, (windInfo.bDefPos) ? CW_USEDEFAULT : WinRect.top, WinRect.right - WinRect.left, WinRect.bottom - WinRect.top, NULL, NULL, hInstance, NULL); } if ( NULL != tkhwnd ) { // If default window positioning used, find out window position and fix // up the windInfo position info. if (windInfo.bDefPos) { GetWindowRect(tkhwnd, &WinRect); windInfo.x = WinRect.left + GetSystemMetrics(SM_CXFRAME); windInfo.y = WinRect.top + GetSystemMetrics(SM_CYCAPTION) - GetSystemMetrics(SM_CYBORDER) + GetSystemMetrics(SM_CYFRAME); } tkhdc = GetDC(tkhwnd); if ( NULL != tkhdc ) ShowWindow(tkhwnd, SW_SHOWDEFAULT); else PrintMessage("Could not get an HDC for window 0x%08lX\n", tkhwnd ); } else PrintMessage("create window failed\n"); if (windInfo.type & TK_INDEX) { RGB_Flag=GL_FALSE; tkSetRGBMap(NCOLORS,(float *) tkRGBMap); } if (windInfo.type & TK_DOUBLE) DB_Flag=GL_TRUE; Cur=WMesaCreateContext(tkhwnd,tkhpalette,RGB_Flag,DB_Flag); WMesaMakeCurrent(Cur); return GL_TRUE; }