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@0
|
113 //width = rect.right - rect.left;
|
nuclear@0
|
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 }
|