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