Mercurial > mplayer.hg
comparison libvo/w32_common.c @ 10880:ba9557e864c0
vo_gl2 port to win32 patch by Tristan Seligmann <mithrandi-mplayer-dev-eng at mithrandi.za.net>
author | faust3 |
---|---|
date | Fri, 19 Sep 2003 14:33:51 +0000 |
parents | |
children | 5d76d070b44b |
comparison
equal
deleted
inserted
replaced
10879:27f8546f53c4 | 10880:ba9557e864c0 |
---|---|
1 #include <limits.h> | |
2 #include <windows.h> | |
3 | |
4 #include "../osdep/keycodes.h" | |
5 #include "../input/input.h" | |
6 #include "../mp_msg.h" | |
7 #include "video_out.h" | |
8 #include "aspect.h" | |
9 #include "w32_common.h" | |
10 | |
11 extern void mplayer_put_key(int code); | |
12 | |
13 static const char* classname = "MPlayer - Media player for Win32"; | |
14 int vo_vm = 0; | |
15 HDC vo_hdc = 0; | |
16 | |
17 uint32_t o_dwidth; | |
18 uint32_t o_dheight; | |
19 | |
20 static HINSTANCE hInstance; | |
21 static HWND vo_hwnd = 0; | |
22 static HGLRC wglContext = 0; | |
23 static int cursor = 1; | |
24 | |
25 static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { | |
26 switch (message) { | |
27 case WM_DESTROY: | |
28 mp_input_queue_cmd(mp_input_parse_cmd("quit")); | |
29 break; | |
30 case WM_SYSCOMMAND: | |
31 switch (wParam) { | |
32 case SC_SCREENSAVE: | |
33 case SC_MONITORPOWER: | |
34 mp_msg(MSGT_VO, MSGL_V, "vo: win32: killing screensaver\n"); | |
35 break; | |
36 default: | |
37 return DefWindowProc(hWnd, message, wParam, lParam); | |
38 } | |
39 break; | |
40 case WM_KEYDOWN: | |
41 switch (wParam) { | |
42 case VK_LEFT: mplayer_put_key(KEY_LEFT); break; | |
43 case VK_UP: mplayer_put_key(KEY_UP); break; | |
44 case VK_RIGHT: mplayer_put_key(KEY_RIGHT); break; | |
45 case VK_DOWN: mplayer_put_key(KEY_DOWN); break; | |
46 case VK_TAB: mplayer_put_key(KEY_TAB); break; | |
47 case VK_CONTROL: mplayer_put_key(KEY_CTRL); break; | |
48 case VK_DELETE: mplayer_put_key(KEY_DELETE); break; | |
49 case VK_INSERT: mplayer_put_key(KEY_INSERT); break; | |
50 case VK_HOME: mplayer_put_key(KEY_HOME); break; | |
51 case VK_END: mplayer_put_key(KEY_END); break; | |
52 case VK_PRIOR: mplayer_put_key(KEY_PAGE_UP); break; | |
53 case VK_NEXT: mplayer_put_key(KEY_PAGE_DOWN); break; | |
54 case VK_ESCAPE: mplayer_put_key(KEY_ESC); break; | |
55 } | |
56 break; | |
57 case WM_CHAR: | |
58 mplayer_put_key(wParam); | |
59 break; | |
60 case WM_LBUTTONDOWN: | |
61 if (!vo_fs) { | |
62 ReleaseCapture(); | |
63 SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0); | |
64 return 0; | |
65 } | |
66 break; | |
67 } | |
68 | |
69 return DefWindowProc(hWnd, message, wParam, lParam); | |
70 } | |
71 | |
72 int vo_w32_check_events(void) { | |
73 MSG msg; | |
74 int r = 0; | |
75 while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { | |
76 TranslateMessage(&msg); | |
77 DispatchMessage(&msg); | |
78 switch (msg.message) { | |
79 case WM_ACTIVATE: | |
80 r |= VO_EVENT_EXPOSE; | |
81 break; | |
82 } | |
83 } | |
84 | |
85 return r; | |
86 } | |
87 | |
88 static void changeMode(void) { | |
89 DEVMODE dm; | |
90 dm.dmSize = sizeof dm; | |
91 dm.dmDriverExtra = 0; | |
92 | |
93 dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; | |
94 dm.dmBitsPerPel = vo_depthonscreen; | |
95 dm.dmPelsWidth = vo_screenwidth; | |
96 dm.dmPelsHeight = vo_screenheight; | |
97 | |
98 if (vo_vm) { | |
99 int bestMode = -1; | |
100 int bestScore = INT_MAX; | |
101 int i; | |
102 for (i = 0; EnumDisplaySettings(0, i, &dm); ++i) { | |
103 if (dm.dmBitsPerPel != vo_depthonscreen) continue; | |
104 if (dm.dmPelsWidth < o_dwidth) continue; | |
105 if (dm.dmPelsHeight < o_dheight) continue; | |
106 int score = (dm.dmPelsWidth - o_dwidth) * (dm.dmPelsHeight - o_dheight); | |
107 | |
108 if (score < bestScore) { | |
109 bestScore = score; | |
110 bestMode = i; | |
111 } | |
112 } | |
113 | |
114 if (bestMode != -1) | |
115 EnumDisplaySettings(0, bestMode, &dm); | |
116 } | |
117 | |
118 vo_screenwidth = dm.dmPelsWidth; | |
119 vo_screenheight = dm.dmPelsHeight; | |
120 aspect_save_screenres(vo_screenwidth, vo_screenheight); | |
121 if (vo_fs) | |
122 aspect(&vo_dwidth, &vo_dheight, A_ZOOM); | |
123 | |
124 ChangeDisplaySettings(&dm, CDS_FULLSCREEN); | |
125 } | |
126 | |
127 static void resetMode(void) { | |
128 ChangeDisplaySettings(0, 0); | |
129 | |
130 DEVMODE dm; | |
131 dm.dmSize = sizeof dm; | |
132 dm.dmDriverExtra = 0; | |
133 dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; | |
134 if (!EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &dm)) { | |
135 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to enumerate display settings!\n"); | |
136 return; | |
137 } | |
138 | |
139 vo_screenwidth = dm.dmPelsWidth; | |
140 vo_screenheight = dm.dmPelsHeight; | |
141 vo_depthonscreen = dm.dmBitsPerPel; | |
142 aspect_save_screenres(vo_screenwidth, vo_screenheight); | |
143 | |
144 vo_dwidth = o_dwidth; | |
145 vo_dheight = o_dheight; | |
146 } | |
147 | |
148 int createRenderingContext(void) { | |
149 if (wglContext) return 1; | |
150 | |
151 if (vo_fs) { | |
152 changeMode(); | |
153 SetWindowPos(vo_hwnd, HWND_TOPMOST, 0, 0, vo_screenwidth, vo_screenheight, SWP_SHOWWINDOW); | |
154 if (cursor) { | |
155 ShowCursor(0); | |
156 cursor = 0; | |
157 } | |
158 } else { | |
159 resetMode(); | |
160 SetWindowPos(vo_hwnd, HWND_NOTOPMOST, (vo_screenwidth - vo_dwidth) / 2, (vo_screenheight - vo_dheight) / 2, vo_dwidth, vo_dheight, SWP_SHOWWINDOW); | |
161 if (!cursor) { | |
162 ShowCursor(1); | |
163 cursor = 1; | |
164 } | |
165 } | |
166 | |
167 PIXELFORMATDESCRIPTOR pfd; | |
168 memset(&pfd, 0, sizeof pfd); | |
169 pfd.nSize = sizeof pfd; | |
170 pfd.nVersion = 1; | |
171 pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; | |
172 pfd.iPixelType = PFD_TYPE_RGBA; | |
173 pfd.cColorBits = 24; | |
174 pfd.iLayerType = PFD_MAIN_PLANE; | |
175 int pf = ChoosePixelFormat(vo_hdc, &pfd); | |
176 if (!pf) { | |
177 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to select a valid pixel format!\n"); | |
178 return 0; | |
179 } | |
180 | |
181 SetPixelFormat(vo_hdc, pf, &pfd); | |
182 | |
183 wglContext = wglCreateContext(vo_hdc); | |
184 if (!wglContext) { | |
185 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to create wgl rendering context!\n"); | |
186 return 0; | |
187 } | |
188 | |
189 if (!wglMakeCurrent(vo_hdc, wglContext)) { | |
190 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to make wgl rendering context current!\n"); | |
191 return 0; | |
192 } | |
193 | |
194 mp_msg(MSGT_VO, MSGL_V, "vo: win32: running at %dx%d with depth %d\n", vo_screenwidth, vo_screenheight, vo_depthonscreen); | |
195 | |
196 return 1; | |
197 } | |
198 | |
199 void destroyRenderingContext(void) { | |
200 if (wglContext) { | |
201 wglMakeCurrent(0, 0); | |
202 wglDeleteContext(wglContext); | |
203 wglContext = 0; | |
204 resetMode(); | |
205 } | |
206 } | |
207 | |
208 int vo_init(void) { | |
209 HICON mplayerIcon = 0; | |
210 char exedir[MAX_PATH]; | |
211 DEVMODE dm; | |
212 | |
213 if (vo_hwnd) | |
214 return 1; | |
215 | |
216 hInstance = GetModuleHandle(0); | |
217 | |
218 if (GetModuleFileName(0, exedir, MAX_PATH)) | |
219 mplayerIcon = ExtractIcon(hInstance, exedir, 0); | |
220 if (!mplayerIcon) | |
221 mplayerIcon = LoadIcon(0, IDI_APPLICATION); | |
222 | |
223 WNDCLASSEX wcex = { sizeof wcex, CS_OWNDC, WndProc, 0, 0, hInstance, mplayerIcon, LoadCursor(0, IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), 0, classname, mplayerIcon }; | |
224 | |
225 if (!RegisterClassEx(&wcex)) { | |
226 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to register window class!\n"); | |
227 return 0; | |
228 } | |
229 | |
230 vo_hwnd = CreateWindowEx(0, classname, classname, WS_POPUP, CW_USEDEFAULT, 0, 100, 100, 0, 0, hInstance, 0); | |
231 if (!vo_hwnd) { | |
232 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to create window!\n"); | |
233 return 0; | |
234 } | |
235 | |
236 vo_hdc = GetDC(vo_hwnd); | |
237 | |
238 dm.dmSize = sizeof dm; | |
239 dm.dmDriverExtra = 0; | |
240 dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; | |
241 if (!EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &dm)) { | |
242 mp_msg(MSGT_VO, MSGL_ERR, "vo: win32: unable to enumerate display settings!\n"); | |
243 return 0; | |
244 } | |
245 vo_screenwidth = dm.dmPelsWidth; | |
246 vo_screenheight = dm.dmPelsHeight; | |
247 vo_depthonscreen = dm.dmBitsPerPel; | |
248 | |
249 return 1; | |
250 } | |
251 | |
252 void vo_w32_fullscreen(void) { | |
253 vo_fs = !vo_fs; | |
254 | |
255 destroyRenderingContext(); | |
256 createRenderingContext(); | |
257 } | |
258 | |
259 void vo_w32_uninit() { | |
260 mp_msg(MSGT_VO, MSGL_V, "vo: win32: uninit\n"); | |
261 resetMode(); | |
262 ShowCursor(1); | |
263 vo_depthonscreen = 0; | |
264 destroyRenderingContext(); | |
265 DestroyWindow(vo_hwnd); | |
266 vo_hwnd = 0; | |
267 } |