winlivebg_test1

annotate src/main.c @ 1:aa6a9521b088

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 17 Oct 2019 09:32:42 +0300
parents d6d791557330
children a9025f31ae2d
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <string.h>
nuclear@0 3 #include <windows.h>
nuclear@0 4 #include <GL/gl.h>
nuclear@0 5
nuclear@0 6 #define WCNAME "livebg_test"
nuclear@0 7
nuclear@0 8 void draw(void);
nuclear@0 9 HWND create_window(int width, int height);
nuclear@0 10 int init_gl(void);
nuclear@0 11 long CALLBACK handle_events(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam);
nuclear@0 12
nuclear@0 13 HWND win;
nuclear@0 14 HDC dc;
nuclear@0 15 HGLRC ctx;
nuclear@0 16 int wcreg, quit;
nuclear@0 17 unsigned long start_time;
nuclear@0 18
nuclear@0 19 int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, char *cmdline, int cmdshow)
nuclear@0 20 {
nuclear@0 21 MSG msg;
nuclear@0 22
nuclear@0 23 if(!(win = create_window(400, 300))) {
nuclear@0 24 return 1;
nuclear@0 25 }
nuclear@0 26 if(init_gl() == -1) {
nuclear@0 27 DestroyWindow(win);
nuclear@0 28 return 1;
nuclear@0 29 }
nuclear@0 30
nuclear@0 31 start_time = timeGetTime();
nuclear@0 32
nuclear@0 33 for(;;) {
nuclear@0 34 while(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
nuclear@0 35 TranslateMessage(&msg);
nuclear@0 36 DispatchMessage(&msg);
nuclear@0 37
nuclear@0 38 if(quit) goto done;
nuclear@0 39 }
nuclear@0 40
nuclear@0 41 draw();
nuclear@0 42 Sleep(10);
nuclear@0 43 }
nuclear@0 44 done:
nuclear@0 45
nuclear@0 46 if(wcreg) {
nuclear@0 47 UnregisterClass(WCNAME, hinst);
nuclear@0 48 }
nuclear@0 49 return 0;
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 void draw(void)
nuclear@0 53 {
nuclear@0 54 float tm = (timeGetTime() - start_time) / 1000.0f;
nuclear@0 55 glClearColor(0.1, 0.1, 0.1, 1);
nuclear@0 56 glClear(GL_COLOR_BUFFER_BIT);
nuclear@0 57
nuclear@0 58 glMatrixMode(GL_MODELVIEW);
nuclear@0 59 glLoadIdentity();
nuclear@0 60 glRotatef(tm * 10.0f, 0, 0, 1);
nuclear@0 61
nuclear@0 62 glBegin(GL_TRIANGLES);
nuclear@0 63 glColor3f(1, 0, 0);
nuclear@0 64 glVertex2f(-0.5, -0.5);
nuclear@0 65 glColor3f(0, 1, 0);
nuclear@0 66 glVertex2f(0.5, -0.5);
nuclear@0 67 glColor3f(0, 0, 1);
nuclear@0 68 glVertex2f(0, 0.68);
nuclear@0 69 glEnd();
nuclear@0 70
nuclear@0 71 SwapBuffers(dc);
nuclear@0 72 }
nuclear@0 73
nuclear@0 74 HWND fadewin;
nuclear@0 75
nuclear@0 76 int CALLBACK match_win(HWND win, LPARAM lparam)
nuclear@0 77 {
nuclear@0 78 HWND shwin = FindWindowEx(win, 0, "SHELLDLL_DefView", 0);
nuclear@0 79 if(shwin) {
nuclear@0 80 fadewin = FindWindowEx(0, shwin, "WorkerW", 0);
nuclear@0 81 }
nuclear@0 82 return 1;
nuclear@0 83 }
nuclear@0 84
nuclear@0 85 HWND create_window(int width, int height)
nuclear@0 86 {
nuclear@0 87 HINSTANCE hinst;
nuclear@0 88 HWND win, parent = 0;
nuclear@0 89 HWND pgman_win;
nuclear@0 90 unsigned int style;
nuclear@0 91 RECT rect;
nuclear@0 92
nuclear@0 93 hinst = GetModuleHandle(0);
nuclear@0 94
nuclear@0 95 if(!wcreg) {
nuclear@0 96 WNDCLASSEX wc;
nuclear@0 97 memset(&wc, 0, sizeof wc);
nuclear@0 98 wc.cbSize = sizeof wc;
nuclear@0 99 wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
nuclear@0 100 wc.lpfnWndProc = handle_events;
nuclear@0 101 wc.hInstance = hinst;
nuclear@0 102 wc.hIcon = wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
nuclear@0 103 wc.hCursor = LoadCursor(0, IDC_ARROW);
nuclear@0 104 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
nuclear@0 105 wc.lpszClassName = WCNAME;
nuclear@0 106 RegisterClassEx(&wc);
nuclear@0 107 wcreg = 1;
nuclear@0 108 }
nuclear@0 109
nuclear@0 110 if((pgman_win = FindWindow("Progman", 0))) {
nuclear@0 111 parent = pgman_win;
nuclear@0 112 GetWindowRect(pgman_win, &rect);
nuclear@1 113 width = rect.right - rect.left;
nuclear@1 114 height = rect.bottom - rect.top;
nuclear@0 115
nuclear@0 116 /*
nuclear@0 117 SendMessage(pgman_win, 0x52c, 0, 0);
nuclear@0 118
nuclear@0 119 fadewin = 0;
nuclear@0 120 EnumWindows(match_win, 0);
nuclear@0 121 if(fadewin) {
nuclear@0 122 //ShowWindow(fadewin, 0);
nuclear@0 123 }
nuclear@0 124 */
nuclear@0 125 }
nuclear@0 126
nuclear@0 127 style = parent ? WS_CHILD : WS_POPUP;
nuclear@0 128 if(!(win = CreateWindow(WCNAME, WCNAME, style | WS_VISIBLE, 0, 0, width, height,
nuclear@0 129 parent, 0, hinst, 0))) {
nuclear@0 130 fprintf(stderr, "failed to create window\n");
nuclear@0 131 return 0;
nuclear@0 132 }
nuclear@0 133 dc = GetDC(win);
nuclear@0 134 return win;
nuclear@0 135 }
nuclear@0 136
nuclear@0 137 int init_gl(void)
nuclear@0 138 {
nuclear@0 139 int pixfmt;
nuclear@0 140 PIXELFORMATDESCRIPTOR pfd;
nuclear@0 141
nuclear@0 142 memset(&pfd, 0, sizeof pfd);
nuclear@0 143 pfd.nSize = sizeof pfd;
nuclear@0 144 pfd.nVersion = 1;
nuclear@0 145 pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
nuclear@0 146 pfd.iPixelType = PFD_TYPE_RGBA;
nuclear@0 147 pfd.cColorBits = 24;
nuclear@0 148 pfd.cDepthBits = 32;
nuclear@0 149 pfd.iLayerType = PFD_MAIN_PLANE;
nuclear@0 150
nuclear@0 151 if(!(pixfmt = ChoosePixelFormat(dc, &pfd))) {
nuclear@0 152 fprintf(stderr, "failed to find a suitable pixel format\n");
nuclear@0 153 return -1;
nuclear@0 154 }
nuclear@0 155 SetPixelFormat(dc, pixfmt, &pfd);
nuclear@0 156
nuclear@0 157 if(!(ctx = wglCreateContext(dc))) {
nuclear@0 158 fprintf(stderr, "failed to create an OpenGL context\n");
nuclear@0 159 return -1;
nuclear@0 160 }
nuclear@0 161 wglMakeCurrent(dc, ctx);
nuclear@0 162 return 0;
nuclear@0 163 }
nuclear@0 164
nuclear@0 165 long CALLBACK handle_events(HWND win, unsigned int msg, WPARAM wparam, LPARAM lparam)
nuclear@0 166 {
nuclear@0 167 switch(msg) {
nuclear@0 168 case WM_PAINT:
nuclear@0 169 ValidateRect(win, 0);
nuclear@0 170 break;
nuclear@0 171
nuclear@0 172 case WM_CLOSE:
nuclear@0 173 DestroyWindow(win);
nuclear@0 174 break;
nuclear@0 175
nuclear@0 176 case WM_DESTROY:
nuclear@0 177 PostQuitMessage(0);
nuclear@0 178 break;
nuclear@0 179
nuclear@0 180 case WM_QUIT:
nuclear@0 181 quit = 1;
nuclear@0 182 break;
nuclear@0 183
nuclear@0 184 default:
nuclear@0 185 return DefWindowProc(win, msg, wparam, lparam);
nuclear@0 186 }
nuclear@0 187 return 0;
nuclear@0 188 }