nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #define WCNAME "livebg_test" nuclear@0: nuclear@2: int colcycle_init(void); nuclear@2: void colcycle_cleanup(void); nuclear@2: void colcycle_draw(long time_msec); nuclear@2: nuclear@2: int scr_width, scr_height; nuclear@2: long upd_interval; nuclear@2: nuclear@0: void draw(void); nuclear@0: HWND create_window(int width, int height); nuclear@0: int init_gl(void); nuclear@0: long CALLBACK handle_events(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam); nuclear@0: nuclear@0: HWND win; nuclear@0: HDC dc; nuclear@0: HGLRC ctx; nuclear@0: int wcreg, quit; nuclear@0: unsigned long start_time; nuclear@0: nuclear@0: int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdline, int cmdshow) nuclear@0: { nuclear@0: MSG msg; nuclear@0: nuclear@0: if(!(win = create_window(400, 300))) { nuclear@0: return 1; nuclear@0: } nuclear@0: if(init_gl() == -1) { nuclear@0: DestroyWindow(win); nuclear@2: goto done; nuclear@2: } nuclear@2: if(colcycle_init() == -1) { nuclear@2: wglMakeCurrent(0, 0); nuclear@2: wglDeleteContext(ctx); nuclear@2: DestroyWindow(win); nuclear@2: goto done; nuclear@0: } nuclear@0: nuclear@0: start_time = timeGetTime(); nuclear@0: nuclear@0: for(;;) { nuclear@0: while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { nuclear@0: TranslateMessage(&msg); nuclear@0: DispatchMessage(&msg); nuclear@0: nuclear@0: if(quit) goto done; nuclear@0: } nuclear@0: nuclear@0: draw(); nuclear@0: } nuclear@0: done: nuclear@0: nuclear@0: if(wcreg) { nuclear@0: UnregisterClass(WCNAME, hinst); nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void draw(void) nuclear@0: { nuclear@2: long now, wait_msec; nuclear@2: long tmsec = timeGetTime() - start_time; nuclear@0: nuclear@2: colcycle_draw(tmsec); nuclear@0: nuclear@2: now = timeGetTime() - start_time; nuclear@2: wait_msec = upd_interval / 1000 - (now - tmsec); nuclear@2: if(wait_msec > 0) { nuclear@2: fprintf(stderr, "wait_msec: %ld\n", wait_msec); nuclear@2: Sleep(wait_msec); nuclear@2: } nuclear@0: nuclear@0: SwapBuffers(dc); nuclear@0: } nuclear@0: nuclear@0: HWND fadewin; nuclear@0: nuclear@0: int CALLBACK match_win(HWND win, LPARAM lparam) nuclear@0: { nuclear@0: HWND shwin = FindWindowEx(win, 0, "SHELLDLL_DefView", 0); nuclear@0: if(shwin) { nuclear@0: fadewin = FindWindowEx(0, shwin, "WorkerW", 0); nuclear@0: } nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: HWND create_window(int width, int height) nuclear@0: { nuclear@0: HINSTANCE hinst; nuclear@0: HWND win, parent = 0; nuclear@0: HWND pgman_win; nuclear@0: unsigned int style; nuclear@0: RECT rect; nuclear@0: nuclear@0: hinst = GetModuleHandle(0); nuclear@0: nuclear@0: if(!wcreg) { nuclear@0: WNDCLASSEX wc; nuclear@0: memset(&wc, 0, sizeof wc); nuclear@0: wc.cbSize = sizeof wc; nuclear@0: wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; nuclear@0: wc.lpfnWndProc = handle_events; nuclear@0: wc.hInstance = hinst; nuclear@0: wc.hIcon = wc.hIconSm = LoadIcon(0, IDI_APPLICATION); nuclear@0: wc.hCursor = LoadCursor(0, IDC_ARROW); nuclear@0: wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); nuclear@0: wc.lpszClassName = WCNAME; nuclear@0: RegisterClassEx(&wc); nuclear@0: wcreg = 1; nuclear@0: } nuclear@0: nuclear@0: if((pgman_win = FindWindow("Progman", 0))) { nuclear@0: parent = pgman_win; nuclear@0: GetWindowRect(pgman_win, &rect); nuclear@1: width = rect.right - rect.left; nuclear@1: height = rect.bottom - rect.top; nuclear@0: nuclear@0: /* nuclear@0: SendMessage(pgman_win, 0x52c, 0, 0); nuclear@0: nuclear@0: fadewin = 0; nuclear@0: EnumWindows(match_win, 0); nuclear@0: if(fadewin) { nuclear@0: //ShowWindow(fadewin, 0); nuclear@0: } nuclear@0: */ nuclear@0: } nuclear@0: nuclear@0: style = parent ? WS_CHILD : WS_POPUP; nuclear@0: if(!(win = CreateWindow(WCNAME, WCNAME, style | WS_VISIBLE, 0, 0, width, height, nuclear@0: parent, 0, hinst, 0))) { nuclear@0: fprintf(stderr, "failed to create window\n"); nuclear@0: return 0; nuclear@0: } nuclear@0: dc = GetDC(win); nuclear@2: nuclear@2: scr_width = width; nuclear@2: scr_height = height; nuclear@0: return win; nuclear@0: } nuclear@0: nuclear@0: int init_gl(void) nuclear@0: { nuclear@0: int pixfmt; nuclear@0: PIXELFORMATDESCRIPTOR pfd; nuclear@0: nuclear@0: memset(&pfd, 0, sizeof pfd); nuclear@0: pfd.nSize = sizeof pfd; nuclear@0: pfd.nVersion = 1; nuclear@0: pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; nuclear@0: pfd.iPixelType = PFD_TYPE_RGBA; nuclear@0: pfd.cColorBits = 24; nuclear@0: pfd.cDepthBits = 32; nuclear@0: pfd.iLayerType = PFD_MAIN_PLANE; nuclear@0: nuclear@0: if(!(pixfmt = ChoosePixelFormat(dc, &pfd))) { nuclear@0: fprintf(stderr, "failed to find a suitable pixel format\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: SetPixelFormat(dc, pixfmt, &pfd); nuclear@0: nuclear@0: if(!(ctx = wglCreateContext(dc))) { nuclear@0: fprintf(stderr, "failed to create an OpenGL context\n"); nuclear@0: return -1; nuclear@0: } nuclear@0: wglMakeCurrent(dc, ctx); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: long CALLBACK handle_events(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam) nuclear@0: { nuclear@0: switch(msg) { nuclear@0: case WM_PAINT: nuclear@0: ValidateRect(win, 0); nuclear@0: break; nuclear@0: nuclear@0: case WM_CLOSE: nuclear@2: colcycle_cleanup(); nuclear@2: wglMakeCurrent(0, 0); nuclear@2: wglDeleteContext(ctx); nuclear@0: DestroyWindow(win); nuclear@0: break; nuclear@0: nuclear@0: case WM_DESTROY: nuclear@0: PostQuitMessage(0); nuclear@0: break; nuclear@0: nuclear@0: case WM_QUIT: nuclear@0: quit = 1; nuclear@0: break; nuclear@0: nuclear@0: default: nuclear@0: return DefWindowProc(win, msg, wparam, lparam); nuclear@0: } nuclear@0: return 0; nuclear@0: }