Mercurial > mplayer.hg
annotate gui/win32/gui.c @ 34325:fc74085e2487
Fix bug in Win32 GUI introduced in r34403.
When selecting a file to open in the open dialog, the open dialog just
reappears.
handlemsg() passes unknown messages (such as evDropFile) to the gui's
playercontrol function (guiSetEvent()). We cannot replace the
handlemsg(hWnd, evDropFile) call by handlemsg(hWnd, evLoadPlay), because
evLoadPlay is known in handlemsg() and has a different meaning there. So
we directly call gui->playercontrol(evLoadPlay) instead where evDropFile
and evLoadPlay have the same meaning.
Reported by Stephen Sheldon, sfsheldo gmail com.
author | ib |
---|---|
date | Thu, 08 Dec 2011 19:41:28 +0000 |
parents | daebf766dea6 |
children | 960c785cb6ef |
rev | line source |
---|---|
23077 | 1 /* |
23079 | 2 * MPlayer GUI for Win32 |
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> | |
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> | |
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26457 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23079 | 22 */ |
23077 | 23 |
24 #include <stdio.h> | |
25 #include <stdlib.h> | |
26 #include <ctype.h> | |
27 #include <fcntl.h> | |
28 #include <windows.h> | |
29 #include <windowsx.h> | |
30 #include <shlobj.h> | |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
31 |
31511
13ca93203358
Factorize MPlayer/MEncoder version string handling.
diego
parents:
30684
diff
changeset
|
32 #include "mpcommon.h" |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
33 #include "mplayer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
34 #include "mp_fifo.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
35 #include "mp_msg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
36 #include "help_mp.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
37 #include "input/input.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
38 #include "input/mouse.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
39 #include "osdep/keycodes.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
40 #include "stream/stream.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
41 #include "libvo/video_out.h" |
30684
dc7ed18ea0df
Include libmpcodecs/vd.h for declaration of "fullscreen".
zuxy
parents:
30558
diff
changeset
|
42 #include "libmpcodecs/vd.h" |
26372
76413880bfad
Update include paths to account for build system changes.
diego
parents:
26193
diff
changeset
|
43 #include "gui/interface.h" |
33761 | 44 #include "gui/ui/actions.h" |
33557 | 45 #include "gui/ui/gmplayer.h" |
33770 | 46 #include "gui/util/mem.h" |
23077 | 47 #include "gui.h" |
48 #include "dialogs.h" | |
33965 | 49 #include "version.h" |
23077 | 50 |
51 // HACK around bug in old mingw | |
52 #undef INVALID_FILE_ATTRIBUTES | |
53 #define INVALID_FILE_ATTRIBUTES ((DWORD)-1) | |
54 | |
55 #ifndef WM_XBUTTONDOWN | |
56 # define WM_XBUTTONDOWN 0x020B | |
57 # define WM_XBUTTONUP 0x020C | |
58 # define WM_XBUTTONDBLCLK 0x020D | |
59 #endif | |
60 | |
61 /* Globals / Externs */ | |
62 float sub_aspect; | |
63 | |
64 DWORD oldtime; | |
65 NOTIFYICONDATA nid; | |
66 int console_state = 0; | |
67 play_tree_t *playtree = NULL; | |
68 | |
69 static HBRUSH colorbrush = NULL; //Handle to colorkey brush | |
70 static COLORREF windowcolor = RGB(255,0,255); //Windowcolor == colorkey | |
71 | |
34163 | 72 /** |
73 * @brief Convert an UTF-8 encoded string into ANSI codepage encoding. | |
74 * | |
75 * @param utf8 UTF-8 encoded string | |
76 * | |
77 * @return string containing ANSI codepage encoding of @a utf8 (or, in case | |
78 * of error, a string containing the question mark character) | |
79 */ | |
80 LPSTR acp (LPCSTR utf8) | |
81 { | |
82 static LPSTR acp_str = NULL; | |
83 int chars; | |
84 LPWSTR uc_str; | |
85 | |
86 chars = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0); | |
87 | |
88 if (chars) | |
89 { | |
90 uc_str = malloc(sizeof(*uc_str) * (chars + 1)); | |
91 | |
92 if (uc_str) | |
93 { | |
94 MultiByteToWideChar(CP_UTF8, 0, utf8, -1, uc_str, chars); | |
95 | |
96 chars = WideCharToMultiByte(CP_ACP, 0, uc_str, -1, NULL, 0, NULL, 0); | |
97 | |
98 if (chars) | |
99 { | |
100 free(acp_str); | |
101 acp_str = malloc(sizeof(*acp_str) * (chars + 1)); | |
102 | |
103 if (acp_str) | |
104 { | |
105 WideCharToMultiByte(CP_ACP, 0, uc_str, -1, acp_str, chars, NULL, 0); | |
106 free(uc_str); | |
107 | |
108 return acp_str; | |
109 } | |
110 } | |
111 | |
112 free(uc_str); | |
113 } | |
114 } | |
115 | |
116 return "?"; | |
117 } | |
118 | |
33579 | 119 static void console_toggle(void) |
23077 | 120 { |
121 if (console_state) | |
122 { | |
123 FreeConsole(); | |
124 console = 0; | |
125 console_state = 0; | |
126 } | |
127 else | |
128 { | |
129 /* This code comes from: http://dslweb.nwnexus.com/~ast/dload/guicon.htm */ | |
130 CONSOLE_SCREEN_BUFFER_INFO coninfo; | |
131 FILE *fp; | |
132 HWND hwnd = NULL; | |
133 console = 1; | |
134 AllocConsole(); | |
31511
13ca93203358
Factorize MPlayer/MEncoder version string handling.
diego
parents:
30684
diff
changeset
|
135 SetConsoleTitle(mplayer_version); |
23077 | 136 |
137 /* disable the close button for now */ | |
138 while (!hwnd) | |
139 { | |
31511
13ca93203358
Factorize MPlayer/MEncoder version string handling.
diego
parents:
30684
diff
changeset
|
140 hwnd = FindWindow(NULL, mplayer_version); |
23077 | 141 Sleep(100); |
142 } | |
143 DeleteMenu(GetSystemMenu(hwnd, 0), SC_CLOSE, MF_BYCOMMAND); | |
144 | |
145 GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); | |
146 coninfo.dwSize.Y = 1000; | |
147 SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); | |
148 fp = freopen("con", "w", stdout); | |
149 *stdout = *fp; | |
150 setvbuf(stdout, NULL, _IONBF, 0); | |
151 fp = freopen("con", "r", stdin); | |
152 *stdin = *fp; | |
153 setvbuf(stdin, NULL, _IONBF, 0); | |
154 fp = freopen("con", "w", stdout); | |
155 *stderr = *fp; | |
156 setvbuf(stderr, NULL, _IONBF, 0); | |
31532 | 157 print_version("MPlayer"); |
23077 | 158 console_state = 1; |
159 } | |
160 } | |
161 | |
162 void capitalize(char *filename) | |
163 { | |
164 unsigned int i; | |
165 BOOL cap = TRUE; | |
166 for (i=0; i < strlen(filename); i++) | |
167 { | |
168 if (cap) | |
169 { | |
170 cap = FALSE; | |
171 filename[i] = toupper(filename[i]); | |
172 } | |
173 else if (filename[i] == ' ') | |
174 cap = TRUE; | |
175 else | |
176 filename[i] = tolower(filename[i]); | |
177 } | |
178 } | |
33965 | 179 static void display_about_box(HWND hWnd) |
180 { | |
181 char about_msg[512]; | |
182 snprintf(about_msg, sizeof(about_msg), MP_TITLE "\n" COPYRIGHT, "MPlayer"); | |
34163 | 183 MessageBox(hWnd, about_msg, acp(MSGTR_About), MB_OK); |
33965 | 184 } |
23077 | 185 |
186 static image *get_drawground(HWND hwnd) | |
187 { | |
188 gui_t * gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); | |
189 unsigned int i; | |
190 if(!gui) return NULL; | |
191 for(i=0; i<gui->window_priv_count; i++) | |
192 if(gui->window_priv[i]->hwnd==hwnd) | |
193 return &gui->window_priv[i]->img; | |
194 return NULL; | |
195 } | |
196 | |
197 static HBITMAP get_bitmap(HWND hwnd) | |
198 { | |
199 gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); | |
200 unsigned int i; | |
201 if(!gui) return NULL; | |
202 for(i=0; i<gui->window_priv_count; i++) | |
203 if(gui->window_priv[i]->hwnd == hwnd) | |
204 return gui->window_priv[i]->bitmap; | |
205 return NULL; | |
206 } | |
207 | |
208 static int get_windowtype(HWND hwnd) | |
209 { | |
210 gui_t *gui = (gui_t *) GetWindowLongPtr(hwnd, GWLP_USERDATA); | |
211 unsigned int i; | |
212 if(!gui) return -1; | |
213 for(i=0; i<gui->window_priv_count; i++) | |
214 if(gui->window_priv[i]->hwnd == hwnd) | |
215 return gui->window_priv[i]->type; | |
216 return -1; | |
217 } | |
218 | |
219 static void uninit(gui_t *gui) | |
220 { | |
221 if(gui->skin) destroy_window(gui); | |
222 if(gui->playlist) gui->playlist->free_playlist(gui->playlist); | |
223 gui->playlist = NULL; | |
224 } | |
225 | |
226 /* | |
227 the gui message handler | |
228 tries to handle the incoming messages | |
229 and passes them to the player's message handler if it can't handle them | |
230 */ | |
231 static void handlemsg(HWND hWnd, int msg) | |
232 { | |
233 gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); | |
234 if(msg == evNone) return; | |
235 | |
236 switch(msg) | |
237 { | |
238 case evLoadPlay: | |
239 case evLoad: | |
240 if(display_openfilewindow(gui, 0) && (msg == evLoadPlay)) | |
34325 | 241 gui->playercontrol(evLoadPlay); |
23077 | 242 return; |
243 case evLoadSubtitle: | |
244 display_opensubtitlewindow(gui); | |
245 break; | |
246 case evPreferences: | |
247 display_prefswindow(gui); | |
248 return; | |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34315
diff
changeset
|
249 case evPlaylist: |
23077 | 250 display_playlistwindow(gui); |
251 return; | |
252 case evSkinBrowser: | |
253 display_skinbrowser(gui); | |
254 break; | |
255 case evEqualizer: | |
256 display_eqwindow(gui); | |
257 break; | |
258 case evAbout: | |
33965 | 259 display_about_box(hWnd); |
23077 | 260 break; |
261 case evIconify: | |
262 ShowWindow(hWnd, SW_MINIMIZE); | |
263 break; | |
264 case evIncVolume: | |
265 mplayer_put_key(KEY_VOLUME_UP); | |
266 break; | |
267 case evDecVolume: | |
268 mplayer_put_key(KEY_VOLUME_DOWN); | |
269 break; | |
270 default: | |
271 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] received msg %s (%i)\n", gui->skin->geteventname(msg), msg); | |
272 break; | |
273 } | |
274 gui->playercontrol(msg); | |
275 } | |
276 | |
277 static widget *clickedinsidewidget(gui_t *gui, int window, int x, int y) | |
278 { | |
279 unsigned int i; | |
280 widget *item; | |
281 for(i=0; i<gui->skin->widgetcount; i++) | |
282 { | |
283 item = gui->skin->widgets[i]; | |
284 if((item->window == window) && (item->x <= x) && (item->x + item->width >= x) && | |
285 (item->y <= y) && (item->y + item->height >= y)) | |
286 return item; | |
287 } | |
288 return NULL; | |
289 } | |
290 | |
291 /* updates sliders and the display */ | |
292 static void updatedisplay(gui_t *gui, HWND hwnd) | |
293 { | |
294 unsigned int i; | |
295 window_priv_t *priv = NULL; | |
296 DWORD time = timeGetTime(); | |
297 | |
298 if(!hwnd) return; | |
299 | |
300 /* load all potmeters hpotmeters */ | |
301 for(i=0; i<gui->skin->widgetcount; i++) | |
302 { | |
303 if(gui->skin->widgets[i]->type == tyHpotmeter || gui->skin->widgets[i]->type == tyPotmeter) | |
304 { | |
305 if(gui->skin->widgets[i]->msg == evSetVolume) | |
33555 | 306 gui->skin->widgets[i]->value = guiInfo.Volume; |
23077 | 307 else if(gui->skin->widgets[i]->msg == evSetMoviePosition) |
33555 | 308 gui->skin->widgets[i]->value = guiInfo.Position; |
23077 | 309 else if(gui->skin->widgets[i]->msg == evSetBalance) |
33555 | 310 gui->skin->widgets[i]->value = guiInfo.Balance; |
23077 | 311 if(gui->skin->widgets[i]->window == get_windowtype(hwnd)) |
312 renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], | |
313 gui->skin->widgets[i]->pressed ? 0 : 1); | |
314 } | |
315 /* update some buttons */ | |
316 if(gui->skin->widgets[i]->type == tyButton && gui->skin->widgets[i]->window == get_windowtype(hwnd)) | |
317 { | |
318 if(gui->skin->widgets[i]->msg == evPlaySwitchToPause) | |
319 { | |
33555 | 320 gui->skin->widgets[i]->value = guiInfo.Playing; |
23077 | 321 renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33580
diff
changeset
|
322 guiInfo.Playing == GUI_PLAY ? 0 : 1); |
23077 | 323 } |
324 if(gui->skin->widgets[i]->msg == evMute) | |
325 { | |
33555 | 326 gui->skin->widgets[i]->value = guiInfo.Volume; |
23077 | 327 renderwidget(gui->skin, get_drawground(hwnd), gui->skin->widgets[i], |
33555 | 328 guiInfo.Volume == 0.0f ? 0 : 1); |
23077 | 329 } |
330 } | |
331 } | |
332 | |
333 /* updating the display once a 100.second is enough imo */ | |
334 if((time - oldtime) < 100) return; | |
335 oldtime=time; | |
336 | |
337 for (i=0; i<gui->window_priv_count; i++) | |
338 { | |
339 if(gui->window_priv[i]->hwnd == hwnd) | |
340 priv=gui->window_priv[i]; | |
341 }// Sherpya | |
342 /* display the status msgs */ | |
343 renderinfobox(gui->skin, priv); | |
344 RedrawWindow(hwnd, NULL, NULL, RDW_INVALIDATE); | |
345 } | |
346 | |
347 static LRESULT CALLBACK SubProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | |
348 { | |
349 gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); | |
350 if (gui && (gui->subwindow != hWnd)) return FALSE; | |
351 | |
352 switch (message) | |
353 { | |
354 case WM_CLOSE: | |
355 handlemsg(hWnd, evExit); | |
356 return 0; | |
357 case WM_DESTROY: | |
358 PostQuitMessage(0); | |
359 return 0; | |
360 case WM_KEYDOWN: | |
361 { | |
362 switch(wParam) | |
363 { | |
364 case VK_LEFT: | |
365 mplayer_put_key(KEY_LEFT); | |
366 break; | |
367 case VK_UP: | |
368 mplayer_put_key(KEY_UP); | |
369 break; | |
370 case VK_RIGHT: | |
371 mplayer_put_key(KEY_RIGHT); | |
372 break; | |
373 case VK_DOWN: | |
374 mplayer_put_key(KEY_DOWN); | |
375 break; | |
376 case VK_TAB: | |
377 mplayer_put_key(KEY_TAB); | |
378 break; | |
379 case VK_BACK: | |
380 mplayer_put_key(KEY_BS); | |
381 break; | |
382 case VK_DELETE: | |
383 mplayer_put_key(KEY_DELETE); | |
384 break; | |
385 case VK_INSERT: | |
386 mplayer_put_key(KEY_INSERT); | |
387 break; | |
388 case VK_HOME: | |
389 mplayer_put_key(KEY_HOME); | |
390 break; | |
391 case VK_END: | |
392 mplayer_put_key(KEY_END); | |
393 break; | |
394 case VK_PRIOR: | |
395 mplayer_put_key(KEY_PAGE_UP); | |
396 break; | |
397 case VK_NEXT: | |
398 mplayer_put_key(KEY_PAGE_DOWN); | |
399 break; | |
400 case VK_ESCAPE: | |
401 mplayer_put_key(KEY_ESC); | |
402 break; | |
403 } | |
404 break; | |
405 } | |
406 case WM_COMMAND: | |
407 { | |
408 switch(LOWORD(wParam)) | |
409 { | |
410 case IDEXIT: | |
411 PostQuitMessage(0); | |
412 handlemsg(hWnd, evExit); | |
413 break; | |
414 case IDFILE_OPEN: | |
415 handlemsg(hWnd, evLoadPlay); | |
416 break; | |
417 case IDURL_OPEN: | |
418 display_openurlwindow(gui, 0); | |
419 break; | |
420 case IDDIR_OPEN: | |
421 { | |
422 static char path[MAX_PATH]; | |
423 BROWSEINFO bi; | |
424 LPITEMIDLIST pidl; | |
425 memset(&bi, 0, sizeof(BROWSEINFO)); | |
34163 | 426 bi.lpszTitle = acp(MSGTR_DirectorySelect); |
23077 | 427 pidl = SHBrowseForFolder(&bi); |
428 if (SHGetPathFromIDList(pidl, path)) | |
429 { | |
430 gui->playlist->clear_playlist(gui->playlist); | |
431 adddirtoplaylist(gui->playlist, path, TRUE); | |
432 gui->startplay(gui); | |
433 } | |
434 break; | |
435 } | |
436 case ID_PTRACK: | |
437 handlemsg(hWnd, evPrev); | |
438 break; | |
439 case ID_SEEKB: | |
440 handlemsg(hWnd, evBackward10sec); | |
441 break; | |
442 case ID_PLAY: | |
443 handlemsg(hWnd, evPlaySwitchToPause); | |
444 break; | |
445 case ID_STOP: | |
446 handlemsg(hWnd, evStop); | |
447 break; | |
448 case ID_SEEKF: | |
449 handlemsg(hWnd, evForward10sec); | |
450 break; | |
451 case ID_NTRACK: | |
452 handlemsg(hWnd, evNext); | |
453 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27292
diff
changeset
|
454 #ifdef CONFIG_DVDREAD |
23077 | 455 case ID_CHAPTERSEL: |
456 display_chapterselwindow(gui); | |
457 break; | |
458 #endif | |
459 case ID_FULLSCREEN: | |
460 mp_input_queue_cmd(mp_input_parse_cmd("vo_fullscreen")); | |
461 break; | |
462 case ID_MUTE: | |
463 mp_input_queue_cmd(mp_input_parse_cmd("mute")); | |
464 break; | |
465 case ID_ASPECT1: | |
466 mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 1.777777")); | |
467 break; | |
468 case ID_ASPECT2: | |
469 mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 1.333333")); | |
470 break; | |
471 case ID_ASPECT3: | |
472 mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 2.35")); | |
473 break; | |
474 case ID_ASPECT4: | |
475 mp_input_queue_cmd(mp_input_parse_cmd("switch_ratio 0")); | |
476 break; | |
477 case IDSUB_TOGGLE: | |
478 mp_input_queue_cmd(mp_input_parse_cmd("sub_visibility")); | |
479 break; | |
480 case IDSUB_CYCLE: | |
481 mp_input_queue_cmd(mp_input_parse_cmd("sub_select")); | |
482 break; | |
483 } | |
484 return 0; | |
485 } | |
486 case WM_CHAR: | |
487 mplayer_put_key(wParam); | |
488 break; | |
489 case WM_DROPFILES: | |
490 { | |
491 if(!lParam) | |
492 { | |
493 char file[MAX_PATH]; | |
494 int filecount = DragQueryFile((HDROP) wParam, -1, file, MAX_PATH); | |
495 int i; | |
496 for(i=0; i<filecount; i++) | |
497 { | |
498 DragQueryFile((HDROP) wParam, i, file, MAX_PATH); | |
33555 | 499 uiSetFileName(NULL, file, STREAMTYPE_FILE); |
23077 | 500 if(!parse_filename(file, playtree, mconfig, 1)) |
501 gui->playlist->add_track(gui->playlist, file, NULL, NULL, 0); | |
502 } | |
503 DragFinish((HDROP) wParam); | |
34325 | 504 gui->playercontrol(evLoadPlay); |
23077 | 505 } |
506 else | |
507 { | |
508 gui->playlist->clear_playlist(gui->playlist); | |
509 gui->playlist->add_track(gui->playlist, (const char *) wParam, NULL, NULL, 0); | |
34325 | 510 gui->playercontrol(evLoadPlay); |
23077 | 511 } |
512 SetForegroundWindow(gui->subwindow); | |
513 return 0; | |
514 } | |
515 case WM_LBUTTONDOWN: | |
516 { | |
517 if(!vo_nomouse_input) | |
518 mplayer_put_key(MOUSE_BTN0); | |
519 break; | |
520 } | |
521 case WM_MBUTTONDOWN: | |
522 { | |
523 if(!vo_nomouse_input) | |
524 mplayer_put_key(MOUSE_BTN1); | |
525 break; | |
526 } | |
527 case WM_RBUTTONDOWN: | |
528 { | |
529 POINT point; | |
530 point.x = GET_X_LPARAM(lParam); | |
531 point.y = GET_Y_LPARAM(lParam); | |
532 ClientToScreen(hWnd, &point); | |
33555 | 533 if(guiInfo.StreamType == STREAMTYPE_DVD) |
23077 | 534 EnableMenuItem(gui->dvdmenu, ID_CHAPTERSEL, MF_BYCOMMAND | MF_ENABLED); |
535 TrackPopupMenu(gui->submenu, 0, point.x, point.y, 0, hWnd, NULL); | |
536 return 0; | |
537 } | |
538 case WM_LBUTTONDBLCLK: | |
539 { | |
540 if(!vo_nomouse_input) | |
541 mplayer_put_key(MOUSE_BTN0_DBL); | |
542 break; | |
543 } | |
544 case WM_MBUTTONDBLCLK: | |
545 { | |
546 if(!vo_nomouse_input) | |
547 mplayer_put_key(MOUSE_BTN1_DBL); | |
548 break; | |
549 } | |
550 case WM_RBUTTONDBLCLK: | |
551 { | |
552 if(!vo_nomouse_input) | |
553 mplayer_put_key(MOUSE_BTN2_DBL); | |
554 break; | |
555 } | |
556 case WM_MOUSEWHEEL: | |
557 { | |
558 int x = GET_WHEEL_DELTA_WPARAM(wParam); | |
559 if(vo_nomouse_input) | |
560 break; | |
561 if (x > 0) | |
562 mplayer_put_key(MOUSE_BTN3); | |
563 else | |
564 mplayer_put_key(MOUSE_BTN4); | |
565 break; | |
566 } | |
567 case WM_XBUTTONDOWN: | |
568 { | |
569 if(vo_nomouse_input) | |
570 break; | |
571 if(HIWORD(wParam) == 1) | |
572 mplayer_put_key(MOUSE_BTN5); | |
573 else | |
574 mplayer_put_key(MOUSE_BTN6); | |
575 break; | |
576 } | |
577 case WM_XBUTTONDBLCLK: | |
578 { | |
579 if(vo_nomouse_input) | |
580 break; | |
581 if(HIWORD(wParam) == 1) | |
582 mplayer_put_key(MOUSE_BTN5_DBL); | |
583 else | |
584 mplayer_put_key(MOUSE_BTN6_DBL); | |
585 break; | |
586 } | |
587 case WM_TIMER: | |
588 { | |
589 if(fullscreen) while(ShowCursor(FALSE) >= 0){} | |
590 KillTimer(hWnd, ID_TIMER); | |
591 return 0; | |
592 } | |
593 case WM_MOUSEMOVE: | |
594 { | |
595 ShowCursor(TRUE); | |
596 SetTimer(hWnd, ID_TIMER, 3000, (TIMERPROC) NULL); | |
597 break; | |
598 } | |
599 case WM_WINDOWPOSCHANGED: | |
600 { | |
601 int tmpheight=0; | |
602 static uint32_t rect_width; | |
603 static uint32_t rect_height; | |
604 RECT rd; | |
605 POINT pt; | |
606 pt.x = 0; | |
607 pt.y = 0; | |
608 GetClientRect(hWnd, &rd); | |
609 ClientToScreen(hWnd, &pt); | |
610 | |
611 rect_width = rd.right - rd.left; | |
612 rect_height = rd.bottom - rd.top; | |
613 | |
614 /* maintain our aspect ratio */ | |
615 tmpheight = ((float)rect_width/sub_aspect); | |
616 tmpheight += tmpheight % 2; | |
617 if(tmpheight > rect_height) | |
618 { | |
619 rect_width = ((float)rect_height*sub_aspect); | |
620 rect_width += rect_width % 2; | |
621 } | |
622 else rect_height = tmpheight; | |
623 | |
624 rd.right = rd.left + rect_width; | |
625 rd.bottom = rd.top + rect_height; | |
626 | |
627 AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); | |
628 SetWindowPos(hWnd, 0, fullscreen?0:pt.x+rd.left, fullscreen?0:pt.y+rd.top, | |
629 fullscreen?vo_screenwidth:rd.right-rd.left, fullscreen?vo_screenheight:rd.bottom-rd.top, SWP_NOOWNERZORDER); | |
630 SetForegroundWindow(hWnd); | |
631 return 0; | |
632 } | |
633 case WM_SYSCOMMAND: | |
634 { | |
635 switch(wParam) | |
636 { | |
637 case SC_SCREENSAVE: | |
638 case SC_MONITORPOWER: | |
639 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>killing screensaver\n" ); | |
640 return 0; | |
641 } | |
642 break; | |
643 } | |
644 case WM_PAINT: | |
645 { | |
646 PAINTSTRUCT ps; | |
647 RECT rect; | |
648 HDC hdc = BeginPaint(hWnd, &ps); | |
649 HDC hMemDC = CreateCompatibleDC(hdc); | |
650 HBRUSH blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH); | |
651 int width, height; | |
652 GetClientRect(hWnd, &rect); | |
653 width = rect.right - rect.left; | |
654 height = rect.bottom - rect.top; | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33580
diff
changeset
|
655 if(guiInfo.Playing == GUI_STOP) |
23077 | 656 { |
657 int i; | |
658 window *desc = NULL; | |
659 | |
660 for (i=0; i<gui->skin->windowcount; i++) | |
661 if(gui->skin->windows[i]->type == wiSub) | |
662 desc = gui->skin->windows[i]; | |
663 | |
664 SelectObject(hMemDC, get_bitmap(hWnd)); | |
665 StretchBlt(hdc, 0, 0, width, height, hMemDC, 0, 0, desc->base->bitmap[0]->width, | |
666 desc->base->bitmap[0]->height, SRCCOPY); | |
667 } else { | |
668 FillRect(GetDC(hWnd), &rect, fullscreen?blackbrush:colorbrush); | |
669 } | |
670 DeleteDC(hMemDC); | |
671 EndPaint(hWnd, &ps); | |
672 return 0; | |
673 } | |
674 } | |
675 return DefWindowProc(hWnd, message, wParam, lParam); | |
676 } | |
677 | |
678 /* Window Proc for the gui Window */ | |
679 static LRESULT CALLBACK EventProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) | |
680 { | |
681 gui_t *gui = (gui_t *) GetWindowLongPtr(hWnd, GWLP_USERDATA); | |
682 | |
683 /* Avoid processing when then window doesn't match gui mainwindow */ | |
684 if (gui && (gui->mainwindow != hWnd)) return FALSE; | |
685 | |
686 switch (message) | |
687 { | |
688 case WM_CLOSE: | |
689 handlemsg(hWnd, evExit); | |
690 return 0; | |
691 case WM_DESTROY: | |
692 PostQuitMessage(0); | |
693 return 0; | |
694 case WM_SYSTRAY: | |
695 { | |
696 switch(lParam) | |
697 { | |
698 POINT cursor; | |
699 case WM_RBUTTONDOWN: | |
700 { | |
701 GetCursorPos(&cursor); | |
702 SetForegroundWindow(hWnd); | |
703 TrackPopupMenu(gui->traymenu, 0, cursor.x, cursor.y, 0, hWnd, NULL); | |
704 break; | |
705 } | |
706 case WM_MBUTTONDBLCLK: | |
707 case WM_LBUTTONDBLCLK: | |
708 { | |
709 if(IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE); | |
710 else { ShowWindow(hWnd, SW_SHOW); SetForegroundWindow(hWnd); } | |
711 break; | |
712 } | |
713 } | |
714 break; | |
715 } | |
716 case WM_KEYDOWN: | |
717 { | |
718 switch(wParam) | |
719 { | |
720 case VK_LEFT: | |
721 mplayer_put_key(KEY_LEFT); | |
722 break; | |
723 case VK_UP: | |
724 mplayer_put_key(KEY_UP); | |
725 break; | |
726 case VK_RIGHT: | |
727 mplayer_put_key(KEY_RIGHT); | |
728 break; | |
729 case VK_DOWN: | |
730 mplayer_put_key(KEY_DOWN); | |
731 break; | |
732 case VK_TAB: | |
733 mplayer_put_key(KEY_TAB); | |
734 break; | |
735 case VK_BACK: | |
736 mplayer_put_key(KEY_BS); | |
737 break; | |
738 case VK_DELETE: | |
739 mplayer_put_key(KEY_DELETE); | |
740 break; | |
741 case VK_INSERT: | |
742 mplayer_put_key(KEY_INSERT); | |
743 break; | |
744 case VK_HOME: | |
745 mplayer_put_key(KEY_HOME); | |
746 break; | |
747 case VK_END: | |
748 mplayer_put_key(KEY_END); | |
749 break; | |
750 case VK_PRIOR: | |
751 mplayer_put_key(KEY_PAGE_UP); | |
752 break; | |
753 case VK_NEXT: | |
754 mplayer_put_key(KEY_PAGE_DOWN); | |
755 break; | |
756 case VK_ESCAPE: | |
757 mplayer_put_key(KEY_ESC); | |
758 break; | |
759 } | |
760 break; | |
761 } | |
762 case WM_CHAR: | |
763 mplayer_put_key(wParam); | |
764 break; | |
765 case WM_COPYDATA: | |
766 { | |
767 if(lParam) | |
768 { | |
769 PCOPYDATASTRUCT cdData; | |
770 cdData = (PCOPYDATASTRUCT) lParam; | |
33555 | 771 uiSetFileName(NULL, cdData->lpData, STREAMTYPE_FILE); |
23077 | 772 if(!parse_filename(cdData->lpData, playtree, mconfig, 1)) |
773 gui->playlist->add_track(gui->playlist, cdData->lpData, NULL, NULL, 0); | |
774 gui->startplay(gui); | |
775 } | |
776 break; | |
777 } | |
778 case WM_DROPFILES: | |
779 { | |
780 if(!lParam) | |
781 { | |
782 char file[MAX_PATH]; | |
783 int filecount = DragQueryFile((HDROP) wParam, -1, file, MAX_PATH); | |
784 int i; | |
785 for(i=0; i<filecount; i++) | |
786 { | |
787 DragQueryFile((HDROP) wParam, i, file, MAX_PATH); | |
33555 | 788 uiSetFileName(NULL, file, STREAMTYPE_FILE); |
23077 | 789 if(!parse_filename(file, playtree, mconfig, 1)) |
790 gui->playlist->add_track(gui->playlist, file, NULL, NULL, 0); | |
791 } | |
792 DragFinish((HDROP) wParam); | |
34325 | 793 gui->playercontrol(evLoadPlay); |
23077 | 794 } |
795 else | |
796 { | |
797 gui->playlist->clear_playlist(gui->playlist); | |
798 gui->playlist->add_track(gui->playlist, (const char *) wParam, NULL, NULL, 0); | |
34325 | 799 gui->playercontrol(evLoadPlay); |
23077 | 800 } |
801 SetForegroundWindow(gui->mainwindow); | |
802 return 0; | |
803 } | |
804 case WM_LBUTTONDOWN: | |
805 { | |
806 SetCapture(hWnd); | |
807 gui->mousex = GET_X_LPARAM(lParam); | |
808 gui->mousey = GET_Y_LPARAM(lParam); | |
809 /* inside a widget */ | |
810 gui->activewidget = clickedinsidewidget(gui, get_windowtype(hWnd), gui->mousex, gui->mousey); | |
811 if(gui->activewidget) | |
812 { | |
813 gui->activewidget->pressed = 1; | |
814 gui->mousewx = gui->mousex - gui->activewidget->x; | |
815 gui->mousewy = gui->mousey - gui->activewidget->y; | |
816 renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 0); | |
817 RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); | |
818 handlemsg(hWnd, gui->activewidget->msg); | |
819 } | |
820 break; | |
821 } | |
822 case WM_CAPTURECHANGED: | |
823 { | |
824 if(gui->activewidget) | |
825 { | |
826 gui->activewidget->pressed = 0; | |
827 renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 1); | |
828 RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); | |
829 gui->activewidget = NULL; | |
830 } | |
831 break; | |
832 } | |
833 case WM_LBUTTONUP: | |
834 { | |
835 ReleaseCapture(); | |
836 if(gui->activewidget) | |
837 { | |
838 gui->activewidget->pressed = 0; | |
839 renderwidget(gui->skin, get_drawground(hWnd), gui->activewidget, 1); | |
840 RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE); | |
841 gui->activewidget = NULL; | |
842 } | |
843 break; | |
844 } | |
845 case WM_RBUTTONDOWN: | |
846 { | |
847 POINT point; | |
848 char device[MAX_PATH]; | |
849 char searchpath[MAX_PATH]; | |
850 char searchpath2[MAX_PATH]; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
851 #ifdef CONFIG_LIBCDIO |
23077 | 852 char searchpath3[MAX_PATH]; |
853 #endif | |
854 int len, pos = 0, cdromdrive = 0; | |
855 UINT errmode; | |
856 point.x = GET_X_LPARAM(lParam); | |
857 point.y = GET_Y_LPARAM(lParam); | |
858 ClientToScreen(hWnd, &point); | |
859 errmode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX); | |
860 while (GetMenuItemCount(gui->diskmenu) > 0) | |
861 DeleteMenu(gui->diskmenu, 0, MF_BYPOSITION); | |
862 len = GetLogicalDriveStrings(MAX_PATH, device); | |
863 while(pos < len) | |
864 { | |
865 if(GetDriveType(device + pos) == DRIVE_CDROM) | |
866 { | |
867 char volname[MAX_PATH]; | |
868 char menuitem[MAX_PATH]; | |
869 int flags = MF_STRING; | |
870 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] checking %s for CD/VCD/SVCD/DVDs\n", device + pos); | |
871 sprintf(searchpath, "%sVIDEO_TS", device + pos); | |
872 sprintf(searchpath2, "%sMpegav", device + pos); | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
873 #ifdef CONFIG_LIBCDIO |
23077 | 874 sprintf(searchpath3, "%sTrack01.cda", device + pos); |
875 #endif | |
876 if(GetFileAttributes(searchpath) != INVALID_FILE_ATTRIBUTES) | |
877 flags |= MF_ENABLED; | |
878 else if(GetFileAttributes(searchpath2) != INVALID_FILE_ATTRIBUTES) | |
879 flags |= MF_ENABLED; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
880 #ifdef CONFIG_LIBCDIO |
23077 | 881 else if(GetFileAttributes(searchpath3) != INVALID_FILE_ATTRIBUTES) |
882 flags |= MF_ENABLED; | |
883 #endif | |
884 else | |
885 flags |= MF_GRAYED; | |
886 volname[0] = 0; | |
887 strcpy(menuitem, device + pos); | |
888 menuitem[strlen(menuitem) - 1]=0; | |
889 GetVolumeInformation(device + pos, volname, MAX_PATH, NULL, NULL, NULL, NULL, 0); | |
890 if (strlen(volname)) | |
891 { | |
892 capitalize(volname); | |
893 strcat(menuitem, " - "); | |
894 strcat(menuitem, volname); | |
895 } | |
896 AppendMenu(gui->diskmenu, flags, IDPLAYDISK + cdromdrive, menuitem); | |
897 cdromdrive++; | |
898 } | |
899 pos += strlen(device + pos) + 1; | |
900 } | |
901 SetErrorMode(errmode); | |
902 TrackPopupMenu(gui->menu, 0, point.x, point.y, 0, hWnd, NULL); | |
903 return 0; | |
904 } | |
905 case WM_MOUSEMOVE: | |
906 { | |
907 if(wParam & MK_LBUTTON) | |
908 { | |
909 POINT point; | |
910 RECT rect; | |
911 if(gui->activewidget) | |
912 { | |
913 widget *item = gui->activewidget; | |
914 | |
915 if(item->type == tyHpotmeter) | |
916 { | |
917 item->x = GET_X_LPARAM(lParam) - gui->mousewx; | |
918 item->value = (float)((float)((item->x - item->wx) * 100.0f) / (float)(item->wwidth - item->width)); | |
919 } | |
920 if(item->type == tyPotmeter) | |
921 { | |
922 gui->mousewx = GET_X_LPARAM(lParam) - gui->activewidget->x; | |
923 item->value = (float) (gui->mousewx * 100.0f) / (float) item->wwidth; | |
924 } | |
925 | |
926 if((item->type == tyPotmeter) || (item->type == tyHpotmeter) || (item->type == tyVpotmeter)) | |
927 { | |
928 /* Bound checks */ | |
929 if(item->value > 100.0f) | |
930 item->value = 100.0f; | |
931 else if(item->value < 0.0f) | |
932 item->value = 0.0f; | |
933 | |
934 if(item->msg == evSetVolume) | |
33555 | 935 guiInfo.Volume = (float) item->value; |
23077 | 936 else if(item->msg == evSetMoviePosition) |
33555 | 937 guiInfo.Position = (float) item->value; |
23077 | 938 else if(item->msg == evSetBalance) |
939 { | |
940 /* make the range for 50% a bit bigger, because the sliders for balance usually suck */ | |
941 if((item->value - 50.0f < 1.5f) && (item->value - 50.0f > -1.5f)) | |
942 item->value = 50.0f; | |
33555 | 943 guiInfo.Balance = (float) item->value; |
23077 | 944 } |
945 updatedisplay(gui, hWnd); | |
946 handlemsg(hWnd, item->msg); | |
947 } | |
948 break; | |
949 } | |
950 point.x = GET_X_LPARAM(lParam); | |
951 point.y = GET_Y_LPARAM(lParam); | |
952 ClientToScreen(hWnd, &point); | |
953 GetWindowRect(hWnd, &rect); | |
954 MoveWindow(hWnd, point.x - gui->mousex, point.y - gui->mousey, | |
955 rect.right-rect.left,rect.bottom-rect.top,TRUE); | |
956 break; | |
957 } | |
958 break; | |
959 } | |
960 case WM_COMMAND: | |
961 { | |
962 switch(LOWORD(wParam)) | |
963 { | |
964 case IDEXIT: | |
965 PostQuitMessage(0); | |
966 handlemsg(hWnd, evExit); | |
967 break; | |
968 case IDFILE_OPEN: | |
969 handlemsg(hWnd, evLoadPlay); | |
970 break; | |
971 case IDDIR_OPEN: | |
972 { | |
973 static char path[MAX_PATH]; | |
974 BROWSEINFO bi; | |
975 LPITEMIDLIST pidl; | |
976 memset(&bi, 0, sizeof(BROWSEINFO)); | |
34163 | 977 bi.lpszTitle = acp(MSGTR_DirectorySelect); |
23077 | 978 pidl = SHBrowseForFolder(&bi); |
979 if (SHGetPathFromIDList(pidl, path)) | |
980 { | |
981 gui->playlist->clear_playlist(gui->playlist); | |
982 adddirtoplaylist(gui->playlist, path, TRUE); | |
983 gui->startplay(gui); | |
984 } | |
985 break; | |
986 } | |
987 case ID_SKINBROWSER: | |
988 handlemsg(hWnd, evSkinBrowser); | |
989 break; | |
990 case IDURL_OPEN: | |
991 display_openurlwindow(gui, 0); | |
992 break; | |
993 case ID_MUTE: | |
994 mp_input_queue_cmd(mp_input_parse_cmd("mute")); | |
995 break; | |
996 case IDSUBTITLE_OPEN: | |
997 display_opensubtitlewindow(gui); | |
998 break; | |
999 case ID_PTRACK: | |
1000 handlemsg(hWnd, evPrev); | |
1001 break; | |
1002 case ID_SEEKB: | |
1003 handlemsg(hWnd, evBackward10sec); | |
1004 break; | |
1005 case ID_PLAY: | |
1006 handlemsg(hWnd, evPlaySwitchToPause); | |
1007 break; | |
1008 case ID_STOP: | |
1009 handlemsg(hWnd, evStop); | |
1010 break; | |
1011 case ID_SEEKF: | |
1012 handlemsg(hWnd, evForward10sec); | |
1013 break; | |
1014 case ID_NTRACK: | |
1015 handlemsg(hWnd, evNext); | |
1016 break; | |
1017 case ID_SHOWHIDE: | |
1018 { | |
1019 if(IsWindowVisible(hWnd)) ShowWindow(hWnd, SW_HIDE); | |
1020 else ShowWindow(hWnd, SW_SHOW); | |
1021 break; | |
1022 } | |
1023 case ID_PLAYLIST: | |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34315
diff
changeset
|
1024 handlemsg(hWnd, evPlaylist); |
23077 | 1025 break; |
1026 case ID_PREFS: | |
1027 handlemsg(hWnd, evPreferences); | |
1028 break; | |
1029 case ID_CONSOLE: | |
1030 console_toggle(); | |
1031 break; | |
1032 case ID_ONLINEHELP: | |
1033 ShellExecute(NULL, "open", ONLINE_HELP_URL, NULL, NULL, SW_SHOWNORMAL); | |
1034 break; | |
33965 | 1035 case IDHELP_ABOUT: |
1036 handlemsg(hWnd, evAbout); | |
1037 break; | |
23077 | 1038 } |
1039 if((IDPLAYDISK <= LOWORD(wParam)) && (LOWORD(wParam) < (IDPLAYDISK + 100))) | |
1040 { | |
1041 char device[MAX_PATH]; | |
1042 char searchpath[MAX_PATH]; | |
1043 char filename[MAX_PATH]; | |
1044 int len, pos = 0, cdromdrive = 0; | |
1045 len = GetLogicalDriveStrings(MAX_PATH, device); | |
1046 while(pos < len) | |
1047 { | |
1048 if(GetDriveType(device + pos)==DRIVE_CDROM) | |
1049 { | |
1050 if(LOWORD(wParam) - IDPLAYDISK == cdromdrive) | |
1051 { | |
1052 sprintf(searchpath, "%sVIDEO_TS", device + pos); | |
1053 if(GetFileAttributes(searchpath) != INVALID_FILE_ATTRIBUTES) | |
1054 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27292
diff
changeset
|
1055 #ifdef CONFIG_DVDREAD |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
31532
diff
changeset
|
1056 free(dvd_device); |
23077 | 1057 dvd_device = strdup(device + pos); |
1058 dvd_title = dvd_chapter = dvd_angle = 1; | |
1059 handlemsg(hWnd, evPlayDVD); | |
23147
21c35763b178
compilation fix for disabling dvd functionality, patch by <bangbangbear at gmail dot com>, slightly modified by me.
vayne
parents:
23091
diff
changeset
|
1060 #endif |
23077 | 1061 } |
1062 sprintf(searchpath, "%sTrack01.cda", device + pos); | |
1063 if(GetFileAttributes(searchpath) != INVALID_FILE_ATTRIBUTES) | |
1064 { | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
1065 #ifdef CONFIG_LIBCDIO |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
31532
diff
changeset
|
1066 free(cdrom_device); |
23077 | 1067 cdrom_device = strdup(device + pos); |
1068 /* mplayer doesn't seem to like the trailing \ after the device name */ | |
1069 cdrom_device[2]=0; | |
1070 handlemsg(hWnd, evPlayCD); | |
1071 #endif | |
23147
21c35763b178
compilation fix for disabling dvd functionality, patch by <bangbangbear at gmail dot com>, slightly modified by me.
vayne
parents:
23091
diff
changeset
|
1072 } else { |
23077 | 1073 HANDLE searchhndl; |
1074 WIN32_FIND_DATA finddata; | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33965
diff
changeset
|
1075 sprintf(searchpath, "%smpegav/*.dat", device + pos); |
23077 | 1076 if((searchhndl=FindFirstFile(searchpath, &finddata)) != INVALID_HANDLE_VALUE) |
1077 { | |
1078 mp_msg(MSGT_GPLAYER,MSGL_V, "Opening VCD/SVCD\n"); | |
1079 gui->playlist->clear_playlist(gui->playlist); | |
1080 do | |
1081 { | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33965
diff
changeset
|
1082 sprintf(filename, "%smpegav/%s", device + pos, finddata.cFileName); |
23077 | 1083 gui->playlist->add_track(gui->playlist, filename, NULL, NULL, 0); |
1084 } | |
1085 while(FindNextFile(searchhndl, &finddata)); | |
1086 FindClose(searchhndl); | |
1087 } | |
1088 gui->startplay(gui); | |
1089 } | |
1090 } | |
1091 cdromdrive++; | |
1092 } | |
1093 pos += strlen(device + pos) + 1; | |
1094 } | |
1095 } | |
1096 break; | |
1097 } | |
1098 case WM_PAINT: | |
1099 { | |
1100 PAINTSTRUCT ps; | |
1101 RECT rd; | |
1102 HDC hdc = BeginPaint(hWnd, &ps); | |
1103 HDC hMemDC = CreateCompatibleDC(hdc); | |
1104 int width, height; | |
1105 GetClientRect(hWnd, &rd); | |
1106 width = rd.right - rd.left; | |
1107 height = rd.bottom - rd.top; | |
1108 SelectObject(hMemDC, get_bitmap(hWnd)); | |
1109 BitBlt(hdc, 0, 0, width, height, hMemDC, 0, 0, SRCCOPY); | |
1110 DeleteDC(hMemDC); | |
1111 EndPaint(hWnd, &ps); | |
1112 return 0; | |
1113 } | |
1114 return 0; | |
1115 } | |
1116 return DefWindowProc(hWnd, message, wParam, lParam); | |
1117 } | |
1118 | |
27292 | 1119 static void startplay(gui_t *gui) |
23077 | 1120 { |
34325 | 1121 gui->playercontrol(evLoadPlay); |
23077 | 1122 } |
1123 | |
1124 /* returns the bits per pixel of the desktop */ | |
1125 /* the format is always in BGR byte order */ | |
1126 static int GetDesktopBitsPerPixel(void) | |
1127 { | |
1128 HWND desktop=GetDesktopWindow(); | |
1129 HDC dc=GetDC(desktop); | |
1130 int bpp=GetDeviceCaps(dc, BITSPIXEL); | |
1131 ReleaseDC(desktop, dc); | |
1132 return bpp; | |
1133 } | |
1134 | |
1135 /* unloads a skin and destroys its windows */ | |
28051 | 1136 int destroy_window(gui_t *gui) |
23077 | 1137 { |
1138 RECT rd; | |
1139 unsigned int i; | |
1140 | |
1141 /* Save position: MSDN says don't pass workspace coordinates | |
1142 * to CreateWindow() or SetWindowPos(), as both of which expect | |
1143 * screen coordinates; resulting in the window appearing in the | |
1144 * wrong location. | |
1145 * -Erik | |
1146 */ | |
1147 | |
1148 /* main window position */ | |
1149 if(IsIconic(gui->mainwindow)) | |
1150 ShowWindow(gui->mainwindow, SW_SHOWNORMAL); | |
1151 GetWindowRect(gui->mainwindow, &rd); | |
1152 gui_main_pos_x = rd.left; | |
1153 gui_main_pos_y = rd.top; | |
1154 | |
1155 /* sub window position */ | |
1156 if(IsIconic(gui->subwindow)) | |
1157 ShowWindow(gui->subwindow, SW_SHOWNORMAL); | |
1158 GetWindowRect(gui->subwindow, &rd); | |
1159 gui_sub_pos_x = rd.left; | |
1160 gui_sub_pos_y = rd.top; | |
1161 | |
1162 for(i=0; i<gui->window_priv_count; i++) | |
1163 { | |
1164 if(gui->window_priv[i]->bitmap) | |
1165 DeleteObject(gui->window_priv[i]->bitmap); | |
1166 free(gui->window_priv[i]); | |
1167 } | |
33770 | 1168 nfree(gui->window_priv); |
23077 | 1169 gui->window_priv_count = 0; |
1170 | |
1171 /* destroy the main window */ | |
1172 if(gui->mainwindow) | |
1173 DestroyWindow(gui->mainwindow); | |
1174 gui->mainwindow = NULL; | |
1175 | |
1176 /* destroy the sub window */ | |
1177 if(gui->subwindow) | |
1178 DestroyWindow(gui->subwindow); | |
1179 gui->subwindow = NULL; | |
1180 | |
1181 UnregisterClass(gui->classname, 0); | |
1182 DestroyIcon(gui->icon); | |
1183 | |
1184 gui->skin->freeskin(gui->skin); | |
1185 gui->skin = NULL; | |
1186 return 0; | |
1187 } | |
1188 | |
1189 static void create_menu(gui_t *gui) | |
1190 { | |
1191 gui->diskmenu = CreatePopupMenu(); | |
1192 gui->menu=CreatePopupMenu(); | |
1193 gui->trayplaymenu = CreatePopupMenu(); | |
34163 | 1194 AppendMenu(gui->menu, MF_STRING | MF_POPUP, (UINT_PTR) gui->trayplaymenu, acp(MSGTR_MENU_Open)); |
1195 AppendMenu(gui->trayplaymenu, MF_STRING, IDFILE_OPEN, acp(MSGTR_MENU_PlayFile)); | |
1196 AppendMenu(gui->trayplaymenu, MF_STRING, IDURL_OPEN, acp(MSGTR_MENU_PlayURL)); | |
1197 AppendMenu(gui->trayplaymenu, MF_STRING, IDDIR_OPEN, acp(MSGTR_MENU_PlayDirectory)); | |
23077 | 1198 AppendMenu(gui->menu, MF_SEPARATOR, 0, 0); |
34163 | 1199 AppendMenu(gui->menu, MF_STRING | MF_POPUP, (UINT_PTR) gui->diskmenu, acp(MSGTR_MENU_PlayDisc)); |
23077 | 1200 AppendMenu(gui->menu, MF_SEPARATOR, 0, 0); |
34163 | 1201 AppendMenu(gui->menu, MF_STRING, IDSUBTITLE_OPEN, acp(MSGTR_MENU_LoadSubtitle)); |
1202 AppendMenu(gui->menu, MF_STRING, ID_SKINBROWSER, acp(MSGTR_MENU_SkinBrowser)); | |
23077 | 1203 AppendMenu(gui->menu, MF_SEPARATOR, 0, 0); |
34163 | 1204 AppendMenu(gui->menu, MF_STRING, ID_PREFS, acp(MSGTR_MENU_Preferences)); |
1205 AppendMenu(gui->menu, MF_STRING, ID_CONSOLE, acp(MSGTR_MENU_DebugConsole)); | |
1206 AppendMenu(gui->menu, MF_STRING, ID_ONLINEHELP, acp(MSGTR_MENU_OnlineHelp)); | |
1207 AppendMenu(gui->menu, MF_STRING, IDHELP_ABOUT, acp(MSGTR_MENU_AboutMPlayer)); | |
23077 | 1208 AppendMenu(gui->menu, MF_SEPARATOR, 0, 0); |
34163 | 1209 AppendMenu(gui->menu, MF_STRING, IDEXIT, acp(MSGTR_MENU_Exit)); |
23077 | 1210 } |
1211 | |
1212 static void create_traymenu(gui_t *gui) | |
1213 { | |
1214 gui->traymenu = CreatePopupMenu(); | |
1215 gui->trayplaybackmenu = CreatePopupMenu(); | |
34163 | 1216 AppendMenu(gui->traymenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->trayplaymenu, acp(MSGTR_MENU_Open)); |
23077 | 1217 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1218 AppendMenu(gui->traymenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->trayplaybackmenu, acp(MSGTR_MENU_Playing)); |
1219 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_SEEKB, acp(MSGTR_MENU_SeekBack)); | |
1220 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_PTRACK, acp(MSGTR_MENU_PrevStream)); | |
1221 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_PLAY, acp(MSGTR_MENU_Play "/" MSGTR_MENU_Pause)); | |
1222 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_STOP, acp(MSGTR_MENU_Stop)); | |
1223 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_NTRACK, acp(MSGTR_MENU_NextStream)); | |
1224 AppendMenu(gui->trayplaybackmenu, MF_STRING, ID_SEEKF, acp(MSGTR_MENU_SeekForw)); | |
23077 | 1225 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1226 AppendMenu(gui->traymenu, MF_STRING, ID_MUTE, acp(MSGTR_MENU_Mute)); |
23077 | 1227 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1228 AppendMenu(gui->traymenu, MF_STRING, IDSUBTITLE_OPEN, acp(MSGTR_MENU_LoadSubtitle)); |
1229 AppendMenu(gui->traymenu, MF_STRING, ID_PLAYLIST, acp(MSGTR_MENU_PlayList)); | |
23077 | 1230 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1231 AppendMenu(gui->traymenu, MF_STRING, ID_SHOWHIDE, acp(MSGTR_MENU_ShowHide)); |
23077 | 1232 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1233 AppendMenu(gui->traymenu, MF_STRING, ID_PREFS, acp(MSGTR_MENU_Preferences)); |
1234 AppendMenu(gui->traymenu, MF_STRING, ID_CONSOLE, acp(MSGTR_MENU_DebugConsole)); | |
1235 AppendMenu(gui->traymenu, MF_STRING, ID_ONLINEHELP, acp(MSGTR_MENU_OnlineHelp)); | |
1236 AppendMenu(gui->traymenu, MF_STRING, IDHELP_ABOUT, acp(MSGTR_MENU_AboutMPlayer)); | |
23077 | 1237 AppendMenu(gui->traymenu, MF_SEPARATOR, 0, 0); |
34163 | 1238 AppendMenu(gui->traymenu, MF_STRING, IDEXIT, acp(MSGTR_MENU_Exit)); |
23077 | 1239 } |
1240 | |
1241 static void create_submenu(gui_t *gui) | |
1242 { | |
1243 gui->submenu = CreatePopupMenu(); | |
1244 gui->dvdmenu = CreatePopupMenu(); | |
1245 gui->aspectmenu = CreatePopupMenu(); | |
1246 gui->subtitlemenu = CreatePopupMenu(); | |
34163 | 1247 AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->trayplaymenu, acp(MSGTR_MENU_Open)); |
23077 | 1248 AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); |
34163 | 1249 AppendMenu(gui->submenu, MF_STRING, ID_SEEKB, acp(MSGTR_MENU_SeekBack)); |
1250 AppendMenu(gui->submenu, MF_STRING, ID_PTRACK, acp(MSGTR_MENU_PrevStream)); | |
1251 AppendMenu(gui->submenu, MF_STRING, ID_PLAY, acp(MSGTR_MENU_Play "/" MSGTR_MENU_Pause)); | |
1252 AppendMenu(gui->submenu, MF_STRING, ID_STOP, acp(MSGTR_MENU_Stop)); | |
1253 AppendMenu(gui->submenu, MF_STRING, ID_NTRACK, acp(MSGTR_MENU_NextStream)); | |
1254 AppendMenu(gui->submenu, MF_STRING, ID_SEEKF, acp(MSGTR_MENU_SeekForw)); | |
23077 | 1255 AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); |
34163 | 1256 AppendMenu(gui->submenu, MF_STRING, ID_FULLSCREEN, acp(MSGTR_MENU_FullScreen)); |
1257 AppendMenu(gui->submenu, MF_STRING, ID_MUTE, acp(MSGTR_MENU_Mute)); | |
23077 | 1258 AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); |
34163 | 1259 AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->aspectmenu, acp(MSGTR_MENU_AspectRatio)); |
1260 AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->subtitlemenu, acp(MSGTR_MENU_Subtitles)); | |
1261 AppendMenu(gui->submenu, MF_STRING | MF_POPUP, (UINT_PTR) gui->dvdmenu, acp(MSGTR_MENU_DVD)); | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
27292
diff
changeset
|
1262 #ifdef CONFIG_DVDREAD |
34163 | 1263 AppendMenu(gui->dvdmenu, MF_STRING | MF_GRAYED, ID_CHAPTERSEL, acp(MSGTR_SelectChapter)); |
23077 | 1264 #endif |
34163 | 1265 AppendMenu(gui->subtitlemenu, MF_STRING, IDSUB_TOGGLE, acp(MSGTR_MENU_SubtitlesOnOff)); |
1266 AppendMenu(gui->subtitlemenu, MF_STRING, IDSUB_CYCLE, acp(MSGTR_MENU_SubtitleLanguages)); | |
1267 AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT1, "16:9"); | |
1268 AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT2, "4:3"); | |
1269 AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT3, "2.35"); | |
23077 | 1270 AppendMenu(gui->aspectmenu, MF_SEPARATOR, 0, 0); |
34163 | 1271 AppendMenu(gui->aspectmenu, MF_STRING, ID_ASPECT4, acp(MSGTR_MENU_Original)); |
23077 | 1272 AppendMenu(gui->submenu, MF_SEPARATOR, 0, 0); |
34163 | 1273 AppendMenu(gui->submenu, MF_STRING, IDEXIT, acp(MSGTR_MENU_Exit)); |
23077 | 1274 } |
1275 | |
1276 static void maketransparent(HWND hwnd, COLORREF crTransparent) | |
1277 { | |
1278 HDC mdc = GetDC(hwnd); | |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1279 RECT wrd, crd; |
23077 | 1280 HRGN crRgnres, crRgn, crRgnTmp; |
1281 int iX = 0, iY = 0, iLeftX = 0; | |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1282 int border, title; |
23077 | 1283 int width, height; |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1284 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1285 GetWindowRect(hwnd, &wrd); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1286 GetClientRect(hwnd, &crd); |
23077 | 1287 |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1288 border = (wrd.right - wrd.left - crd.right) / 2; |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1289 title = (wrd.bottom - wrd.top - crd.bottom) - border; |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1290 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1291 width = crd.right - crd.left; |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1292 height = crd.bottom - crd.top; |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1293 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1294 /* create the title bar region */ |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1295 crRgn = CreateRectRgn(0, 0, width + border + border, title); |
23077 | 1296 |
1297 /* Create a region from a bitmap with transparency colour of Purple */ | |
1298 for (iY = -1; iY < height; iY++) | |
1299 { | |
1300 do | |
1301 { | |
1302 /* skip over transparent pixels at start of lines */ | |
1303 while (iX <= width && GetPixel(mdc,iX, iY) == crTransparent) iX++; | |
1304 | |
1305 /* remember this pixel */ | |
1306 iLeftX = iX; | |
1307 | |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1308 /* now find last non transparent pixel */ |
23077 | 1309 while (iX <= width && GetPixel(mdc,iX, iY) != crTransparent) ++iX; |
1310 | |
1311 /* create a temp region on this info */ | |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1312 crRgnTmp = CreateRectRgn(iLeftX + border, iY + title, iX + border, iY + title + 1); |
23077 | 1313 |
1314 /* combine into main region */ | |
1315 crRgnres = crRgn; | |
1316 CombineRgn(crRgnres, crRgn, crRgnTmp, RGN_OR); | |
1317 crRgn = crRgnres; | |
1318 | |
1319 /* delete the temp region for next pass (otherwise you'll get an ASSERT) */ | |
1320 DeleteObject(crRgnTmp); | |
1321 } while (iX < width); | |
1322 iX = 0; | |
1323 } | |
34133
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1324 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1325 /* left border region */ |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1326 crRgnTmp = CreateRectRgn(0, title, border, title + height); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1327 CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1328 DeleteObject(crRgnTmp); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1329 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1330 /* right border region */ |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1331 crRgnTmp = CreateRectRgn(width + border, title, width + border + border, title + height); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1332 CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1333 DeleteObject(crRgnTmp); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1334 |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1335 /* bottom region */ |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1336 crRgnTmp = CreateRectRgn(0, title + height, width + border + border, title + height + border); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1337 CombineRgn(crRgn, crRgn, crRgnTmp, RGN_OR); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1338 DeleteObject(crRgnTmp); |
568f3a8e1b89
Support transparency in decorated windows in the Win32 GUI.
ib
parents:
34092
diff
changeset
|
1339 |
23077 | 1340 SetWindowRgn(hwnd, crRgn, TRUE); |
1341 DeleteObject(crRgn); | |
1342 ReleaseDC(hwnd,mdc); | |
1343 } | |
1344 | |
1345 static int window_render(gui_t *gui, HWND hWnd, HDC hdc, window_priv_t *priv, window *desc, BITMAPINFO binfo) | |
1346 { | |
1347 int i; | |
33638
dbca6aa18b50
Cast new user data value in SetWindowLongPtr() to LONG_PTR.
ib
parents:
33615
diff
changeset
|
1348 SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) gui); |
23077 | 1349 (gui->window_priv_count)++; |
1350 gui->window_priv = realloc(gui->window_priv, sizeof(window_priv_t *) * gui->window_priv_count); | |
1351 priv = gui->window_priv[gui->window_priv_count - 1] = calloc(1, sizeof(window_priv_t)); | |
1352 priv->hwnd = hWnd; | |
1353 priv->type = desc->type; | |
1354 priv->background = desc->base->bitmap[0]; | |
1355 memcpy(&priv->img, desc->base->bitmap[0], sizeof(image)); | |
1356 hdc = GetDC(hWnd); | |
1357 binfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); | |
1358 binfo.bmiHeader.biWidth = priv->img.width; | |
1359 binfo.bmiHeader.biHeight = -priv->img.height; | |
1360 binfo.bmiHeader.biPlanes = 1; | |
1361 binfo.bmiHeader.biSizeImage = priv->img.width * priv->img.height * (gui->screenbpp / 8); | |
1362 binfo.bmiHeader.biXPelsPerMeter = 0; | |
1363 binfo.bmiHeader.biYPelsPerMeter = 0; | |
1364 binfo.bmiHeader.biClrUsed = 0; | |
1365 binfo.bmiHeader.biClrImportant = 0; | |
1366 binfo.bmiHeader.biBitCount = gui->screenbpp; | |
1367 binfo.bmiHeader.biCompression = BI_RGB; | |
1368 priv->bitmap = CreateDIBSection(hdc, &binfo, DIB_RGB_COLORS, (void **) &priv->img.data, NULL, 0); | |
1369 if(!priv->bitmap) | |
1370 { | |
1371 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] unable to create bitmap for skinned window\n"); | |
1372 return 0; | |
1373 } | |
1374 memcpy(priv->img.data, desc->base->bitmap[0]->data, binfo.bmiHeader.biSizeImage); | |
1375 ReleaseDC(hWnd,hdc); | |
1376 | |
1377 for (i=0; i<gui->skin->widgetcount; i++) | |
1378 if(gui->skin->widgets[i]->window == desc->type) | |
1379 renderwidget(gui->skin, &priv->img, gui->skin->widgets[i], 1); | |
1380 | |
1381 return 0; | |
1382 } | |
1383 | |
1384 /* creates the sub (AKA video) window,*/ | |
33782
896b427e598e
Remove unused parameter skindir from create_subwindow() in Win32 GUI.
ib
parents:
33781
diff
changeset
|
1385 int create_subwindow(gui_t *gui) |
23077 | 1386 { |
1387 HINSTANCE instance = GetModuleHandle(NULL); | |
1388 WNDCLASS wc; | |
1389 RECT rect; | |
1390 HWND hWnd; | |
1391 DWORD style = 0; | |
1392 HDC hdc = NULL; | |
1393 BITMAPINFO binfo; | |
1394 window_priv_t *priv = NULL; | |
1395 window *desc = NULL; | |
1396 int i, x = -1, y = -1; | |
1397 vo_colorkey = 0xff00ff; | |
1398 | |
1399 for (i=0; i<gui->skin->windowcount; i++) | |
1400 if(gui->skin->windows[i]->type == wiSub) | |
1401 desc = gui->skin->windows[i]; | |
1402 | |
1403 if(!desc) | |
1404 { | |
1405 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] Invalid skin description\n"); | |
1406 return 1; | |
1407 } | |
1408 | |
1409 windowcolor = vo_colorkey; | |
1410 colorbrush = CreateSolidBrush(windowcolor); | |
1411 wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS; | |
1412 wc.lpfnWndProc = SubProc; | |
1413 wc.cbClsExtra = 0; | |
1414 wc.cbWndExtra = 0; | |
1415 wc.hInstance = instance; | |
1416 wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
1417 wc.hIcon = gui->icon; | |
1418 wc.hbrBackground = NULL; //WM_PAINT will handle background color switching; | |
34162 | 1419 wc.lpszClassName = "MPlayer - Video"; |
23077 | 1420 wc.lpszMenuName = NULL; |
1421 RegisterClass(&wc); | |
1422 | |
1423 /* create the sub window menu */ | |
1424 create_submenu(gui); | |
1425 | |
1426 rect.top = rect.left = 100; | |
1427 rect.bottom = rect.top+desc->base->bitmap[0]->height; | |
1428 rect.right = rect.left+desc->base->bitmap[0]->width; | |
1429 | |
1430 /* our window aspect */ | |
1431 sub_aspect = (float)(rect.right-rect.left)/(rect.bottom-rect.top); | |
1432 | |
1433 style = fullscreen?WS_VISIBLE | WS_POPUP:WS_OVERLAPPEDWINDOW | WS_SYSMENU | WS_MINIMIZEBOX; | |
1434 AdjustWindowRect(&rect, style, 0); | |
1435 | |
1436 if (gui_sub_pos_x >= 0) | |
1437 x = gui_sub_pos_x; | |
1438 if (gui_sub_pos_y >= 0) | |
1439 y = gui_sub_pos_y; | |
1440 | |
1441 /* out of bounds check */ | |
1442 if (x <= -1 || (x+(rect.right-rect.left) > GetSystemMetrics(SM_CXSCREEN))) | |
1443 x = CW_USEDEFAULT; | |
1444 if (y <= -1 || (y+(rect.bottom-rect.top) > GetSystemMetrics(SM_CYSCREEN))) | |
1445 y = x; | |
1446 | |
34162 | 1447 hWnd = CreateWindowEx(0, "MPlayer - Video", "MPlayer - Video", style, |
23077 | 1448 x, y, rect.right-rect.left, rect.bottom-rect.top, |
1449 gui->subwindow, NULL, instance, NULL); | |
1450 | |
1451 /* load all the window images */ | |
1452 window_render(gui, hWnd, hdc, priv, desc, binfo); | |
1453 | |
1454 /* enable drag and drop support */ | |
1455 DragAcceptFiles(hWnd, TRUE); | |
1456 | |
1457 gui->subwindow = hWnd; | |
1458 if(sub_window) | |
1459 WinID = gui->subwindow; | |
1460 ShowWindow(gui->subwindow, SW_SHOW); | |
1461 UpdateWindow(gui->subwindow); | |
1462 return 0; | |
1463 } | |
1464 | |
1465 /* loads/updates a skin and creates windows for it */ | |
28051 | 1466 int create_window(gui_t *gui, char *skindir) |
23077 | 1467 { |
1468 HINSTANCE instance = GetModuleHandle(NULL); | |
1469 WNDCLASS wc; | |
1470 RECT rect; | |
1471 DWORD style = 0; | |
1472 HWND hwnd; | |
1473 HDC hdc = NULL; | |
1474 BITMAPINFO binfo; | |
1475 window_priv_t *priv = NULL; | |
1476 window *desc = NULL; | |
1477 char dir[MAX_PATH]; | |
1478 unsigned int i; | |
1479 int x = -1, y = -1; | |
1480 | |
1481 /* destroy the current main window */ | |
1482 if(gui->skin) destroy_window(gui); | |
1483 | |
1484 /* get screenproperties */ | |
1485 gui->screenbpp = GetDesktopBitsPerPixel(); | |
1486 gui->screenw = GetSystemMetrics(SM_CXSCREEN); | |
1487 gui->screenh = GetSystemMetrics(SM_CYSCREEN); | |
1488 | |
1489 /* load the new skin */ | |
1490 gui->skin = loadskin(skindir, gui->screenbpp); | |
1491 if(!gui->skin) | |
1492 { | |
1493 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] fatal error during skinload\n"); | |
1494 /* Set default Skin */ | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
31532
diff
changeset
|
1495 free(skinName); |
23077 | 1496 skinName = strdup("Blue"); |
1497 /* then force write conf */ | |
1498 cfg_write(); | |
1499 return 1; | |
1500 } | |
1501 | |
1502 /* find the description of the mainwindow */ | |
1503 for (i=0; i<gui->skin->windowcount; i++) | |
1504 if(gui->skin->windows[i]->type == wiMain) | |
1505 desc = gui->skin->windows[i]; | |
1506 | |
1507 if(!desc) | |
1508 { | |
1509 mp_msg(MSGT_GPLAYER, MSGL_FATAL, "[GUI] Invalid skin description\n"); | |
1510 return 1; | |
1511 } | |
1512 | |
1513 /* load the icon from the executable */ | |
1514 GetModuleFileName(NULL, dir, MAX_PATH); | |
1515 gui->icon = ExtractIcon(instance, dir, 0); | |
1516 | |
1517 /* create the window class */ | |
1518 wc.style = CS_HREDRAW | CS_VREDRAW; | |
1519 wc.lpfnWndProc = EventProc; | |
1520 wc.cbClsExtra = 0; | |
1521 wc.cbWndExtra = 0; | |
1522 wc.hInstance = instance; | |
1523 wc.hCursor = LoadCursor(NULL, IDC_ARROW); | |
1524 wc.hIcon = gui->icon; | |
1525 wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); | |
34162 | 1526 wc.lpszClassName = gui->classname = "MPlayer"; |
23077 | 1527 wc.lpszMenuName = NULL; |
1528 RegisterClass(&wc); | |
1529 | |
1530 /* create a context menu */ | |
1531 create_menu(gui); | |
1532 /* create the systray menu */ | |
1533 create_traymenu(gui); | |
1534 | |
1535 /* create the mainwindow */ | |
1536 /* TODO implement aligning as described in skin.html */ | |
1537 rect.top = rect.left = 100; | |
1538 rect.bottom = rect.top+desc->base->bitmap[0]->height; | |
1539 rect.right = rect.left+desc->base->bitmap[0]->width; | |
1540 if(desc->decoration) style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX; | |
1541 else style = WS_POPUP | WS_SYSMENU; | |
1542 | |
1543 AdjustWindowRect(&rect, style, 0); | |
1544 | |
1545 /* Check if out of screen */ | |
1546 if (gui_main_pos_x >= 0) | |
1547 x = gui_main_pos_x; | |
1548 if (gui_main_pos_y >= 0) | |
1549 y = gui_main_pos_y; | |
1550 | |
1551 if (x <= -1 || (x+(rect.right-rect.left) > GetSystemMetrics(SM_CXFULLSCREEN))) | |
1552 { | |
1553 x = (GetSystemMetrics(SM_CXSCREEN) / 2) - ((rect.right-rect.left) / 2); | |
1554 gui_main_pos_x = x; | |
1555 } | |
1556 if (y <= -1 || (y+(rect.bottom-rect.top) > GetSystemMetrics(SM_CYFULLSCREEN))) | |
1557 { | |
1558 y = ((GetSystemMetrics(SM_CYSCREEN)-40) - (rect.bottom-rect.top)); | |
1559 gui_main_pos_y = y; | |
1560 } | |
1561 | |
34162 | 1562 hwnd = CreateWindowEx(0, gui->classname, "MPlayer", style, |
23077 | 1563 x, y, rect.right-rect.left, rect.bottom-rect.top, |
1564 gui->mainwindow, NULL, instance, NULL); | |
1565 | |
1566 /* set the systray icon properties */ | |
1567 nid.cbSize = sizeof(NOTIFYICONDATA); | |
1568 nid.hWnd = hwnd; | |
1569 nid.uID = 1; | |
1570 nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; | |
1571 nid.uCallbackMessage = WM_SYSTRAY; | |
1572 nid.hIcon = gui->icon; | |
34162 | 1573 strcpy(nid.szTip, "MPlayer"); |
23077 | 1574 |
1575 /* register the systray icon */ | |
1576 Shell_NotifyIcon(NIM_ADD, &nid); | |
1577 | |
1578 /* load all the window images */ | |
1579 window_render(gui, hwnd, hdc, priv, desc, binfo); | |
1580 | |
1581 /* enable drag and drop support */ | |
1582 DragAcceptFiles(hwnd, TRUE); | |
1583 | |
1584 updatedisplay(gui, hwnd); | |
1585 gui->mainwindow = hwnd; | |
1586 | |
1587 /* display */ | |
1588 ShowWindow(gui->mainwindow, SW_SHOW); | |
1589 UpdateWindow(gui->mainwindow); | |
1590 maketransparent(gui->mainwindow, RGB(255, 0, 255)); | |
1591 return 0; | |
1592 } | |
1593 | |
33781 | 1594 gui_t *create_gui(char *skindir, void (*playercontrol)(int event)) |
23077 | 1595 { |
1596 gui_t *gui = calloc(1, sizeof(gui_t)); | |
1597 char temp[MAX_PATH]; | |
34162 | 1598 HWND runningmplayer = FindWindow("MPlayer", "MPlayer"); |
23077 | 1599 |
1600 if(runningmplayer) | |
1601 { | |
1602 free(gui); | |
1603 return NULL; | |
1604 } | |
1605 | |
1606 gui->startplay = startplay; | |
1607 gui->playercontrol = playercontrol; | |
1608 gui->uninit = uninit; | |
1609 gui->updatedisplay = updatedisplay; | |
1610 | |
1611 /* create playlist */ | |
1612 gui->playlist = create_playlist(); | |
1613 | |
34092
dbf5042ab255
Don't use the Windows style path separator character in Win32 GUI.
ib
parents:
33965
diff
changeset
|
1614 sprintf(temp, "%s/%s", skindir, skinName); |
23077 | 1615 if(create_window(gui, temp)) return NULL; |
33782
896b427e598e
Remove unused parameter skindir from create_subwindow() in Win32 GUI.
ib
parents:
33781
diff
changeset
|
1616 if(create_subwindow(gui)) return NULL; |
23077 | 1617 if(console) console_toggle(); |
1618 return gui; | |
1619 } |