Mercurial > mplayer.hg
annotate gui/win32/interface.c @ 33442:ed7f2a6b58e6
Fix code assuming that "char" is signed.
author | reimar |
---|---|
date | Mon, 30 May 2011 21:25:32 +0000 |
parents | c9c9f015619b |
children | c5a19bbeac2b |
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 <windows.h> | |
33358 | 25 |
26 #if defined(__CYGWIN__) | |
27 #define _beginthreadex CreateThread | |
28 #else | |
29 #include <process.h> | |
30 #endif | |
31 | |
30901 | 32 #include "path.h" |
26372
76413880bfad
Update include paths to account for build system changes.
diego
parents:
26193
diff
changeset
|
33 #include "gui/interface.h" |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
34 #include "m_option.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
35 #include "mixer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
36 #include "mp_msg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
37 #include "help_mp.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
38 #include "codec-cfg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
39 #include "stream/stream.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
40 #include "libmpdemux/demuxer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
41 #include "libmpdemux/stheader.h" |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
42 #ifdef CONFIG_DVDREAD |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
43 #include "stream/stream_dvd.h" |
23077 | 44 #endif |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
45 #include "input/input.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
46 #include "libvo/video_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
47 #include "libao2/audio_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
48 #include "access_mpcontext.h" |
30558 | 49 #include "libmpcodecs/vd.h" |
31425
2392ad3cec9c
Move af_cfg extern variable declaration to dec_audio.h.
diego
parents:
31312
diff
changeset
|
50 #include "libmpcodecs/dec_audio.h" |
30558 | 51 #include "gui/mplayer/gmplayer.h" |
52 #include "mp_core.h" | |
32093 | 53 #include "mpcommon.h" |
23077 | 54 #include "gui.h" |
55 #include "dialogs.h" | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
56 #ifdef CONFIG_LIBCDIO |
23077 | 57 #include <cdio/cdio.h> |
58 #endif | |
59 | |
60 int guiWinID = 0; | |
61 | |
62 char *skinName = NULL; | |
63 char *codecname = NULL; | |
64 int mplGotoTheNext = 1; | |
65 static gui_t *mygui = NULL; | |
66 static int update_subwindow(void); | |
67 static RECT old_rect; | |
68 static DWORD style; | |
24992 | 69 static HANDLE hThread; |
70 static unsigned threadId; | |
25765
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
71 const ao_functions_t *audio_out = NULL; |
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
72 const vo_functions_t *video_out = NULL; |
23077 | 73 mixer_t *mixer = NULL; |
74 | |
75 /* test for playlist files, no need to specify -playlist on the commandline. | |
76 * add any conceivable playlist extensions here. | |
77 * - Erik | |
78 */ | |
79 int parse_filename(char *file, play_tree_t *playtree, m_config_t *mconfig, int clear) | |
80 { | |
81 if(clear) | |
82 mygui->playlist->clear_playlist(mygui->playlist); | |
83 | |
84 if(strstr(file, ".m3u") || strstr(file, ".pls")) | |
85 { | |
86 playtree = parse_playlist_file(file); | |
87 import_playtree_playlist_into_gui(playtree, mconfig); | |
88 return 1; | |
89 } | |
90 return 0; | |
91 } | |
92 | |
93 /** | |
94 * \brief this actually creates a new list containing only one element... | |
95 */ | |
96 void gaddlist( char ***list, const char *entry) | |
97 { | |
98 int i; | |
99 | |
100 if (*list) | |
101 { | |
102 for (i=0; (*list)[i]; i++) free((*list)[i]); | |
103 free(*list); | |
104 } | |
105 | |
106 *list = malloc(2 * sizeof(char **)); | |
107 (*list)[0] = gstrdup(entry); | |
108 (*list)[1] = NULL; | |
109 } | |
110 | |
111 char *gstrdup(const char *str) | |
112 { | |
113 if (!str) return NULL; | |
114 return strdup(str); | |
115 } | |
116 | |
117 /** | |
118 * \brief this replaces a string starting with search by replace. | |
119 * If not found, replace is appended. | |
120 */ | |
121 void greplace(char ***list, char *search, char *replace) | |
122 { | |
123 int i = 0; | |
124 int len = (search) ? strlen(search) : 0; | |
125 | |
126 if (*list) | |
127 { | |
128 for (i = 0; (*list)[i]; i++) | |
129 { | |
130 if (search && (!strncmp((*list)[i], search, len))) | |
131 { | |
132 free((*list)[i]); | |
133 (*list)[i] = gstrdup(replace); | |
134 return; | |
135 } | |
136 } | |
137 *list = realloc(*list, (i + 2) * sizeof(char *)); | |
138 } | |
139 else | |
140 *list = malloc(2 * sizeof(char *)); | |
141 | |
142 (*list)[i] = gstrdup(replace); | |
143 (*list)[i + 1] = NULL; | |
144 } | |
145 | |
146 /* this function gets called by the gui to update mplayer */ | |
147 static void guiSetEvent(int event) | |
148 { | |
149 if(guiIntfStruct.mpcontext) | |
150 mixer = mpctx_get_mixer(guiIntfStruct.mpcontext); | |
151 | |
152 switch(event) | |
153 { | |
154 case evPlay: | |
155 case evPlaySwitchToPause: | |
23148
71efd1fc20c8
add missing case value, fixes functionality when using some skins.
vayne
parents:
23147
diff
changeset
|
156 case evPauseSwitchToPlay: |
23077 | 157 mplPlay(); |
158 break; | |
159 case evPause: | |
160 mplPause(); | |
161 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
162 #ifdef CONFIG_DVDREAD |
23077 | 163 case evPlayDVD: |
164 { | |
165 static char dvdname[MAX_PATH]; | |
166 guiIntfStruct.DVD.current_title = dvd_title; | |
167 guiIntfStruct.DVD.current_chapter = dvd_chapter; | |
168 guiIntfStruct.DVD.current_angle = dvd_angle; | |
169 guiIntfStruct.DiskChanged = 1; | |
170 | |
171 mplSetFileName(NULL, dvd_device, STREAMTYPE_DVD); | |
172 dvdname[0] = 0; | |
173 strcat(dvdname, "DVD Movie"); | |
174 GetVolumeInformation(dvd_device, dvdname, MAX_PATH, NULL, NULL, NULL, NULL, 0); | |
175 capitalize(dvdname); | |
176 mp_msg(MSGT_GPLAYER, MSGL_V, "Opening DVD %s -> %s\n", dvd_device, dvdname); | |
177 guiGetEvent(guiSetParameters, (char *) STREAMTYPE_DVD); | |
178 mygui->playlist->clear_playlist(mygui->playlist); | |
179 mygui->playlist->add_track(mygui->playlist, filename, NULL, dvdname, 0); | |
180 mygui->startplay(mygui); | |
181 break; | |
182 } | |
183 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
184 #ifdef CONFIG_LIBCDIO |
23077 | 185 case evPlayCD: |
186 { | |
187 int i; | |
188 char track[10]; | |
189 char trackname[10]; | |
190 CdIo_t *p_cdio = cdio_open(NULL, DRIVER_UNKNOWN); | |
191 track_t i_tracks; | |
192 | |
193 if(p_cdio == NULL) printf("Couldn't find a driver.\n"); | |
194 i_tracks = cdio_get_num_tracks(p_cdio); | |
195 | |
196 mygui->playlist->clear_playlist(mygui->playlist); | |
197 for(i=0;i<i_tracks;i++) | |
198 { | |
199 sprintf(track, "cdda://%d", i+1); | |
200 sprintf(trackname, "Track %d", i+1); | |
201 mygui->playlist->add_track(mygui->playlist, track, NULL, trackname, 0); | |
202 } | |
203 cdio_destroy(p_cdio); | |
204 mygui->startplay(mygui); | |
205 break; | |
206 } | |
207 #endif | |
208 case evFullScreen: | |
209 mp_input_queue_cmd(mp_input_parse_cmd("vo_fullscreen")); | |
210 break; | |
211 case evExit: | |
212 { | |
213 /* We are asking mplayer to exit, later it will ask us after uninit is made | |
214 this should be the only safe way to quit */ | |
215 mygui->activewidget = NULL; | |
216 mp_input_queue_cmd(mp_input_parse_cmd("quit")); | |
217 break; | |
218 } | |
219 case evStop: | |
220 if(guiIntfStruct.Playing) | |
221 guiGetEvent(guiCEvent, (void *) guiSetStop); | |
222 break; | |
223 case evSetMoviePosition: | |
224 { | |
225 rel_seek_secs = guiIntfStruct.Position / 100.0f; | |
226 abs_seek_pos = 3; | |
227 break; | |
228 } | |
229 case evForward10sec: | |
230 { | |
231 rel_seek_secs = 10.0f; | |
232 abs_seek_pos = 0; | |
233 break; | |
234 } | |
235 case evBackward10sec: | |
236 { | |
237 rel_seek_secs = -10.0f; | |
238 abs_seek_pos = 0; | |
239 break; | |
240 } | |
241 case evSetBalance: | |
242 case evSetVolume: | |
243 { | |
244 float l,r; | |
245 | |
246 if (guiIntfStruct.Playing == 0) | |
247 break; | |
248 | |
249 if (guiIntfStruct.Balance == 50.0f) | |
250 mixer_setvolume(mixer, guiIntfStruct.Volume, guiIntfStruct.Volume); | |
251 | |
252 l = guiIntfStruct.Volume * ((100.0f - guiIntfStruct.Balance) / 50.0f); | |
253 r = guiIntfStruct.Volume * ((guiIntfStruct.Balance) / 50.0f); | |
254 | |
255 if (l > guiIntfStruct.Volume) l=guiIntfStruct.Volume; | |
256 if (r > guiIntfStruct.Volume) r=guiIntfStruct.Volume; | |
257 mixer_setvolume(mixer, l, r); | |
258 /* Check for balance support on mixer - there is a better way ?? */ | |
259 if (r != l) | |
260 { | |
261 mixer_getvolume(mixer, &l, &r); | |
262 if (r == l) | |
263 { | |
264 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Mixer doesn't support balanced audio\n"); | |
265 mixer_setvolume(mixer, guiIntfStruct.Volume, guiIntfStruct.Volume); | |
266 guiIntfStruct.Balance = 50.0f; | |
267 } | |
268 } | |
269 break; | |
270 } | |
271 case evMute: | |
272 { | |
273 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
274 cmd->id=MP_CMD_MUTE; | |
275 cmd->name=strdup("mute"); | |
276 mp_input_queue_cmd(cmd); | |
277 break; | |
278 } | |
279 case evDropFile: | |
280 case evLoadPlay: | |
281 { | |
282 switch(guiIntfStruct.StreamType) | |
283 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
284 #ifdef CONFIG_DVDREAD |
23077 | 285 case STREAMTYPE_DVD: |
286 { | |
287 guiIntfStruct.Title = guiIntfStruct.DVD.current_title; | |
288 guiIntfStruct.Chapter = guiIntfStruct.DVD.current_chapter; | |
289 guiIntfStruct.Angle = guiIntfStruct.DVD.current_angle; | |
290 guiIntfStruct.DiskChanged = 1; | |
291 guiGetEvent(guiCEvent, (void *) guiSetPlay); | |
292 break; | |
293 } | |
23147
21c35763b178
compilation fix for disabling dvd functionality, patch by <bangbangbear at gmail dot com>, slightly modified by me.
vayne
parents:
23123
diff
changeset
|
294 #endif |
23077 | 295 default: |
296 { | |
297 guiIntfStruct.FilenameChanged = guiIntfStruct.NewPlay = 1; | |
298 update_playlistwindow(); | |
299 mplGotoTheNext = guiIntfStruct.Playing? 0 : 1; | |
300 guiGetEvent(guiCEvent, (void *) guiSetStop); | |
301 guiGetEvent(guiCEvent, (void *) guiSetPlay); | |
302 break; | |
303 } | |
304 } | |
305 break; | |
306 } | |
307 case evNext: | |
308 mplNext(); | |
309 break; | |
310 case evPrev: | |
311 mplPrev(); | |
312 break; | |
313 } | |
314 } | |
315 | |
316 void mplPlay( void ) | |
317 { | |
318 if((!guiIntfStruct.Filename ) || (guiIntfStruct.Filename[0] == 0)) | |
319 return; | |
320 | |
321 if(guiIntfStruct.Playing > 0) | |
322 { | |
323 mplPause(); | |
324 return; | |
325 } | |
326 guiIntfStruct.NewPlay = 1; | |
327 guiGetEvent(guiCEvent, (void *) guiSetPlay); | |
328 } | |
329 | |
330 void mplPause( void ) | |
331 { | |
332 if(!guiIntfStruct.Playing) return; | |
333 | |
334 if(guiIntfStruct.Playing == 1) | |
335 { | |
336 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
337 cmd->id=MP_CMD_PAUSE; | |
338 cmd->name=strdup("pause"); | |
339 mp_input_queue_cmd(cmd); | |
340 } else guiIntfStruct.Playing = 1; | |
341 } | |
342 | |
343 void mplNext(void) | |
344 { | |
345 if(guiIntfStruct.Playing == 2) return; | |
346 switch(guiIntfStruct.StreamType) | |
347 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
348 #ifdef CONFIG_DVDREAD |
23077 | 349 case STREAMTYPE_DVD: |
350 if(guiIntfStruct.DVD.current_chapter == (guiIntfStruct.DVD.chapters - 1)) | |
351 return; | |
352 guiIntfStruct.DVD.current_chapter++; | |
353 break; | |
354 #endif | |
355 default: | |
356 if(mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
357 return; | |
358 mplSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, | |
359 STREAMTYPE_STREAM); | |
360 break; | |
361 } | |
362 mygui->startplay(mygui); | |
363 } | |
364 | |
365 void mplPrev(void) | |
366 { | |
367 if(guiIntfStruct.Playing == 2) return; | |
368 switch(guiIntfStruct.StreamType) | |
369 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
370 #ifdef CONFIG_DVDREAD |
23077 | 371 case STREAMTYPE_DVD: |
372 if(guiIntfStruct.DVD.current_chapter == 1) | |
373 return; | |
374 guiIntfStruct.DVD.current_chapter--; | |
375 break; | |
376 #endif | |
377 default: | |
378 if(mygui->playlist->current == 0) | |
379 return; | |
380 mplSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)--]->filename, | |
381 STREAMTYPE_STREAM); | |
382 break; | |
383 } | |
384 mygui->startplay(mygui); | |
385 } | |
386 | |
387 void mplEnd( void ) | |
388 { | |
389 if(!mplGotoTheNext && guiIntfStruct.Playing) | |
390 { | |
391 mplGotoTheNext = 1; | |
392 return; | |
393 } | |
394 | |
395 if(mplGotoTheNext && guiIntfStruct.Playing && | |
396 (mygui->playlist->current < (mygui->playlist->trackcount - 1)) && | |
397 guiIntfStruct.StreamType != STREAMTYPE_DVD && | |
398 guiIntfStruct.StreamType != STREAMTYPE_DVDNAV) | |
399 { | |
400 /* we've finished this file, reset the aspect */ | |
401 if(movie_aspect >= 0) | |
402 movie_aspect = -1; | |
403 | |
404 mplGotoTheNext = guiIntfStruct.FilenameChanged = guiIntfStruct.NewPlay = 1; | |
405 mplSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, STREAMTYPE_STREAM); | |
406 //sprintf(guiIntfStruct.Filename, mygui->playlist->tracks[(mygui->playlist->current)++]->filename); | |
407 } | |
408 | |
409 if(guiIntfStruct.FilenameChanged && guiIntfStruct.NewPlay) | |
410 return; | |
411 | |
412 guiIntfStruct.TimeSec = 0; | |
413 guiIntfStruct.Position = 0; | |
414 guiIntfStruct.AudioType = 0; | |
415 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
416 #ifdef CONFIG_DVDREAD |
23077 | 417 guiIntfStruct.DVD.current_title = 1; |
418 guiIntfStruct.DVD.current_chapter = 1; | |
419 guiIntfStruct.DVD.current_angle = 1; | |
420 #endif | |
421 | |
422 if (mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
423 mygui->playlist->current = 0; | |
424 | |
425 fullscreen = 0; | |
426 if(style == WS_VISIBLE | WS_POPUP) | |
427 { | |
428 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
429 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
430 } | |
431 guiGetEvent(guiCEvent, (void *) guiSetStop); | |
432 } | |
433 | |
434 void mplSetFileName(char *dir, char *name, int type) | |
435 { | |
436 if(!name) return; | |
437 if(!dir) | |
438 guiSetFilename(guiIntfStruct.Filename, name) | |
439 else | |
440 guiSetDF(guiIntfStruct.Filename, dir, name); | |
441 | |
442 guiIntfStruct.StreamType = type; | |
33298 | 443 free(guiIntfStruct.AudioFile); |
444 guiIntfStruct.AudioFile = NULL; | |
445 free(guiIntfStruct.Subtitlename); | |
446 guiIntfStruct.Subtitlename = NULL; | |
23077 | 447 } |
448 | |
449 void mplFullScreen( void ) | |
450 { | |
451 if(!guiIntfStruct.sh_video) return; | |
452 | |
453 if(sub_window) | |
454 { | |
455 if(!fullscreen && IsWindowVisible(mygui->subwindow) && !IsIconic(mygui->subwindow)) | |
456 GetWindowRect(mygui->subwindow, &old_rect); | |
457 | |
458 if(fullscreen) | |
459 { | |
460 fullscreen = 0; | |
461 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
462 } else { | |
463 fullscreen = 1; | |
464 style = WS_VISIBLE | WS_POPUP; | |
465 } | |
466 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
467 update_subwindow(); | |
468 } | |
469 video_out->control(VOCTRL_FULLSCREEN, 0); | |
470 if(sub_window) ShowWindow(mygui->subwindow, SW_SHOW); | |
471 } | |
472 | |
24992 | 473 static unsigned __stdcall GuiThread(void* param) |
23077 | 474 { |
475 MSG msg; | |
476 | |
477 if(!skinName) skinName = strdup("Blue"); | |
478 if(!mygui) mygui = create_gui(get_path("skins"), skinName, guiSetEvent); | |
30558 | 479 if(!mygui) exit_player(EXIT_ERROR); |
23077 | 480 |
481 if(autosync && autosync != gtkAutoSync) | |
482 { | |
483 gtkAutoSyncOn = 1; | |
484 gtkAutoSync = autosync; | |
485 } | |
486 | |
24992 | 487 while(GetMessage(&msg, NULL, 0, 0)) |
23077 | 488 { |
489 TranslateMessage(&msg); | |
490 DispatchMessage(&msg); | |
491 } | |
23078 | 492 fprintf(stderr, "[GUI] GUI thread terminated.\n"); |
23077 | 493 fflush(stderr); |
494 return 0; | |
495 } | |
496 | |
497 void guiInit(void) | |
498 { | |
499 memset(&guiIntfStruct, 0, sizeof(guiIntfStruct)); | |
500 /* Create The gui thread */ | |
501 if (!mygui) | |
502 { | |
33358 | 503 hThread = _beginthreadex(NULL, 0, GuiThread, NULL, 0, &threadId); |
23077 | 504 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Creating GUI Thread 0x%04x\n", threadId); |
505 } | |
506 | |
507 /* Wait until the gui is created */ | |
508 while(!mygui) Sleep(100); | |
23078 | 509 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] GUI thread started.\n"); |
23077 | 510 } |
511 | |
512 void guiDone(void) | |
513 { | |
514 if(mygui) | |
515 { | |
516 fprintf(stderr, "[GUI] Closed by main mplayer window\n"); | |
517 fflush(stderr); | |
24992 | 518 PostThreadMessage(threadId, WM_QUIT, 0, 0); |
519 WaitForSingleObject(hThread, INFINITE); | |
520 CloseHandle(hThread); | |
23077 | 521 mygui->uninit(mygui); |
522 free(mygui); | |
523 mygui = NULL; | |
524 } | |
525 /* Remove tray icon */ | |
526 Shell_NotifyIcon(NIM_DELETE, &nid); | |
527 cfg_write(); | |
528 } | |
529 | |
530 /* this function gets called by mplayer to update the gui */ | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
531 int guiGetEvent(int type, void *arg) |
23077 | 532 { |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
533 stream_t *stream = arg; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
534 #ifdef CONFIG_DVDREAD |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
535 dvd_priv_t *dvdp = arg; |
23077 | 536 #endif |
537 if(!mygui || !mygui->skin) return 0; | |
538 | |
539 if(guiIntfStruct.mpcontext) | |
540 { | |
541 audio_out = mpctx_get_audio_out(guiIntfStruct.mpcontext); | |
542 video_out = mpctx_get_video_out(guiIntfStruct.mpcontext); | |
543 mixer = mpctx_get_mixer(guiIntfStruct.mpcontext); | |
544 playtree = mpctx_get_playtree_iter(guiIntfStruct.mpcontext); | |
545 } | |
546 | |
547 switch (type) | |
548 { | |
549 case guiSetFileFormat: | |
550 guiIntfStruct.FileFormat = (int) arg; | |
551 break; | |
552 case guiSetParameters: | |
553 { | |
554 guiGetEvent(guiSetDefaults, NULL); | |
555 guiIntfStruct.DiskChanged = 0; | |
556 guiIntfStruct.FilenameChanged = 0; | |
557 guiIntfStruct.NewPlay = 0; | |
558 switch(guiIntfStruct.StreamType) | |
559 { | |
560 case STREAMTYPE_PLAYLIST: | |
561 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
562 #ifdef CONFIG_DVDREAD |
23077 | 563 case STREAMTYPE_DVD: |
564 { | |
565 char tmp[512]; | |
566 dvd_title = guiIntfStruct.DVD.current_title; | |
567 dvd_chapter = guiIntfStruct.DVD.current_chapter; | |
568 dvd_angle = guiIntfStruct.DVD.current_angle; | |
569 sprintf(tmp,"dvd://%d", guiIntfStruct.Title); | |
570 guiSetFilename(guiIntfStruct.Filename, tmp); | |
571 break; | |
572 } | |
573 #endif | |
574 } | |
575 if(guiIntfStruct.Filename) | |
576 filename = strdup(guiIntfStruct.Filename); | |
577 else if(filename) | |
578 strcpy(guiIntfStruct.Filename, filename); | |
579 break; | |
580 } | |
581 case guiSetAudioOnly: | |
582 { | |
583 guiIntfStruct.AudioOnly = (int) arg; | |
584 if(IsWindowVisible(mygui->subwindow)) | |
585 ShowWindow(mygui->subwindow, SW_HIDE); | |
586 break; | |
587 } | |
588 case guiSetContext: | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
589 guiIntfStruct.mpcontext = arg; |
23077 | 590 break; |
591 case guiSetDemuxer: | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
592 guiIntfStruct.demuxer = arg; |
23077 | 593 break; |
594 case guiSetValues: | |
595 { | |
596 guiIntfStruct.sh_video = arg; | |
597 if (arg) | |
598 { | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
599 sh_video_t *sh = arg; |
23077 | 600 codecname = sh->codec->name; |
601 guiIntfStruct.FPS = sh->fps; | |
602 | |
603 /* we have video, show the subwindow */ | |
604 if(!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) | |
605 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); | |
606 if(WinID == -1) | |
607 update_subwindow(); | |
608 | |
609 } | |
610 break; | |
611 } | |
612 case guiSetShVideo: | |
613 { | |
614 guiIntfStruct.MovieWidth = vo_dwidth; | |
615 guiIntfStruct.MovieHeight = vo_dheight; | |
616 | |
617 sub_aspect = (float)guiIntfStruct.MovieWidth/guiIntfStruct.MovieHeight; | |
618 if(WinID != -1) | |
619 update_subwindow(); | |
620 break; | |
621 } | |
622 case guiSetStream: | |
623 { | |
624 guiIntfStruct.StreamType = stream->type; | |
625 switch(stream->type) | |
626 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
627 #ifdef CONFIG_DVDREAD |
23077 | 628 case STREAMTYPE_DVD: |
629 guiGetEvent(guiSetDVD, (char *) stream->priv); | |
630 break; | |
631 #endif | |
632 } | |
633 break; | |
634 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
635 #ifdef CONFIG_DVDREAD |
23077 | 636 case guiSetDVD: |
637 { | |
638 guiIntfStruct.DVD.titles = dvdp->vmg_file->tt_srpt->nr_of_srpts; | |
639 guiIntfStruct.DVD.chapters = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
640 guiIntfStruct.DVD.angles = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
641 guiIntfStruct.DVD.nr_of_audio_channels = dvdp->nr_of_channels; | |
642 memcpy(guiIntfStruct.DVD.audio_streams, dvdp->audio_streams, sizeof(dvdp->audio_streams)); | |
643 guiIntfStruct.DVD.nr_of_subtitles = dvdp->nr_of_subtitles; | |
644 memcpy(guiIntfStruct.DVD.subtitles, dvdp->subtitles, sizeof(dvdp->subtitles)); | |
645 guiIntfStruct.DVD.current_title = dvd_title + 1; | |
646 guiIntfStruct.DVD.current_chapter = dvd_chapter + 1; | |
647 guiIntfStruct.DVD.current_angle = dvd_angle + 1; | |
648 guiIntfStruct.Track = dvd_title + 1; | |
649 break; | |
650 } | |
651 #endif | |
652 case guiReDraw: | |
653 mygui->updatedisplay(mygui, mygui->mainwindow); | |
654 break; | |
655 case guiSetAfilter: | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
656 guiIntfStruct.afilter = arg; |
23077 | 657 break; |
658 case guiCEvent: | |
659 { | |
660 guiIntfStruct.Playing = (int) arg; | |
661 switch (guiIntfStruct.Playing) | |
662 { | |
663 case guiSetPlay: | |
664 { | |
665 guiIntfStruct.Playing = 1; | |
666 break; | |
667 } | |
668 case guiSetStop: | |
669 { | |
670 guiIntfStruct.Playing = 0; | |
671 if(movie_aspect >= 0) | |
672 movie_aspect = -1; | |
673 update_subwindow(); | |
674 break; | |
675 } | |
676 case guiSetPause: | |
677 guiIntfStruct.Playing = 2; | |
678 break; | |
679 } | |
680 break; | |
681 } | |
682 case guiIEvent: | |
683 { | |
684 mp_msg(MSGT_GPLAYER,MSGL_V, "cmd: %d\n", (int) arg); | |
685 /* MPlayer asks us to quit */ | |
686 switch((int) arg) | |
687 { | |
31312
0b7792622c88
Remove Gui-specific slave commands and associated key-bindings and other code.
reimar
parents:
30901
diff
changeset
|
688 case MP_CMD_VO_FULLSCREEN: |
23077 | 689 mplFullScreen(); |
690 break; | |
691 case MP_CMD_QUIT: | |
692 { | |
693 mygui->uninit(mygui); | |
694 free(mygui); | |
695 mygui = NULL; | |
30558 | 696 exit_player(EXIT_QUIT); |
23077 | 697 return 0; |
698 } | |
699 default: | |
700 break; | |
701 } | |
702 break; | |
703 } | |
704 case guiSetFileName: | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
705 if (arg) guiIntfStruct.Filename = arg; |
23077 | 706 break; |
707 case guiSetDefaults: | |
708 { | |
709 audio_id = -1; | |
710 video_id = -1; | |
711 dvdsub_id = -1; | |
712 vobsub_id = -1; | |
713 stream_cache_size = -1; | |
714 autosync = 0; | |
715 dvd_title = 0; | |
716 force_fps = 0; | |
717 if(!mygui->playlist->tracks) return 0; | |
718 filename = guiIntfStruct.Filename = mygui->playlist->tracks[mygui->playlist->current]->filename; | |
719 guiIntfStruct.Track = mygui->playlist->current + 1; | |
720 if(gtkAONorm) greplace(&af_cfg.list, "volnorm", "volnorm"); | |
721 if(gtkAOExtraStereo) | |
722 { | |
723 char *name = malloc(12 + 20 + 1); | |
724 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
725 name[12 + 20] = 0; | |
726 greplace(&af_cfg.list, "extrastereo", name); | |
727 free(name); | |
728 } | |
729 if(gtkCacheOn) stream_cache_size = gtkCacheSize; | |
730 if(gtkAutoSyncOn) autosync = gtkAutoSync; | |
731 break; | |
732 } | |
733 case guiSetVolume: | |
734 { | |
735 if(audio_out) | |
736 { | |
737 /* Some audio_out drivers do not support balance e.g. dsound */ | |
738 /* FIXME this algo is not correct */ | |
739 float l, r; | |
740 mixer_getvolume(mixer, &l, &r); | |
741 guiIntfStruct.Volume = (r > l ? r : l); /* max(r,l) */ | |
742 if (r != l) | |
743 guiIntfStruct.Balance = ((r-l) + 100.0f) * 0.5f; | |
744 else | |
745 guiIntfStruct.Balance = 50.0f; | |
746 } | |
747 break; | |
748 } | |
749 default: | |
750 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[GUI] GOT UNHANDLED EVENT %i\n", type); | |
751 } | |
752 return 0; | |
753 } | |
754 | |
755 /* This function adds/inserts one file into the gui playlist */ | |
756 int import_file_into_gui(char *pathname, int insert) | |
757 { | |
758 char filename[MAX_PATH]; | |
759 char *filepart = filename; | |
760 | |
761 if (strstr(pathname, "://")) | |
762 { | |
763 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding special %s\n", pathname); | |
764 mygui->playlist->add_track(mygui->playlist, pathname, NULL, NULL, 0); | |
765 return 1; | |
766 } | |
767 if (GetFullPathName(pathname, MAX_PATH, filename, &filepart)) | |
768 { | |
769 if (!(GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY)) | |
770 { | |
771 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding filename: %s - fullpath: %s\n", filepart, filename); | |
772 mygui->playlist->add_track(mygui->playlist, filename, NULL, filepart, 0); | |
773 return 1; | |
774 } | |
775 else | |
776 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Cannot add %s\n", filename); | |
777 } | |
778 | |
779 return 0; | |
780 } | |
781 | |
782 /* This function imports the initial playtree (based on cmd-line files) into the gui playlist | |
783 by either: | |
784 - overwriting gui pl (enqueue=0) */ | |
785 | |
786 int import_initial_playtree_into_gui(play_tree_t *my_playtree, m_config_t *config, int enqueue) | |
787 { | |
788 play_tree_iter_t *my_pt_iter = NULL; | |
789 int result = 0; | |
790 | |
791 if(!mygui) guiInit(); | |
792 | |
793 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
794 { | |
795 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
796 { | |
797 if (parse_filename(filename, my_playtree, config, 0)) | |
798 result = 1; | |
799 else if (import_file_into_gui(filename, 0)) /* Add it to end of list */ | |
800 result = 1; | |
801 } | |
802 } | |
803 mplGotoTheNext = 1; | |
804 | |
805 if (result) | |
806 { | |
807 mygui->playlist->current = 0; | |
808 filename = mygui->playlist->tracks[0]->filename; | |
809 } | |
810 return result; | |
811 } | |
812 | |
813 /* This function imports and inserts an playtree, that is created "on the fly", for example by | |
814 parsing some MOV-Reference-File; or by loading an playlist with "File Open" | |
815 The file which contained the playlist is thereby replaced with it's contents. */ | |
816 | |
817 int import_playtree_playlist_into_gui(play_tree_t *my_playtree, m_config_t *config) | |
818 { | |
819 play_tree_iter_t *my_pt_iter = NULL; | |
820 int result = 0; | |
821 | |
822 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
823 { | |
824 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
825 if (import_file_into_gui(filename, 1)) /* insert it into the list and set plCurrent = new item */ | |
826 result = 1; | |
827 pt_iter_destroy(&my_pt_iter); | |
828 } | |
829 filename = NULL; | |
830 return result; | |
831 } | |
832 | |
833 inline void gtkMessageBox(int type, const char *str) | |
834 { | |
835 if (type & GTK_MB_FATAL) | |
836 MessageBox(NULL, str, "MPlayer GUI for Windows Error", MB_OK | MB_ICONERROR); | |
837 | |
838 fprintf(stderr, "[GUI] MessageBox: %s\n", str); | |
839 fflush(stderr); | |
840 } | |
841 | |
842 void guiMessageBox(int level, char *str) | |
843 { | |
844 switch(level) | |
845 { | |
846 case MSGL_FATAL: | |
847 gtkMessageBox(GTK_MB_FATAL | GTK_MB_SIMPLE, str); | |
848 break; | |
849 case MSGL_ERR: | |
850 gtkMessageBox(GTK_MB_ERROR | GTK_MB_SIMPLE, str); | |
851 break; | |
852 } | |
853 } | |
854 | |
855 static int update_subwindow(void) | |
856 { | |
857 int x,y; | |
858 RECT rd; | |
859 WINDOWPOS wp; | |
860 | |
861 if(!sub_window) | |
862 { | |
863 WinID = -1; // so far only directx supports WinID in windows | |
864 | |
865 if(IsWindowVisible(mygui->subwindow) && guiIntfStruct.sh_video && guiIntfStruct.Playing) | |
866 { | |
867 ShowWindow(mygui->subwindow, SW_HIDE); | |
868 return 0; | |
869 } | |
870 else if(guiIntfStruct.AudioOnly) | |
871 return 0; | |
872 else ShowWindow(mygui->subwindow, SW_SHOW); | |
873 } | |
874 | |
875 /* we've come out of fullscreen at the end of file */ | |
876 if((!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) && !guiIntfStruct.AudioOnly) | |
877 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); | |
878 | |
879 /* get our current window coordinates */ | |
880 GetWindowRect(mygui->subwindow, &rd); | |
881 | |
882 x = rd.left; | |
883 y = rd.top; | |
884 | |
885 /* restore sub window position when coming out of fullscreen */ | |
886 if(x <= 0) x = old_rect.left; | |
887 if(y <= 0) y = old_rect.top; | |
888 | |
889 if(!guiIntfStruct.Playing) | |
890 { | |
891 window *desc = NULL; | |
892 int i; | |
893 | |
894 for (i=0; i<mygui->skin->windowcount; i++) | |
895 if(mygui->skin->windows[i]->type == wiSub) | |
896 desc = mygui->skin->windows[i]; | |
897 | |
898 rd.right = rd.left+desc->base->bitmap[0]->width; | |
899 rd.bottom = rd.top+desc->base->bitmap[0]->height; | |
900 sub_aspect = (float)(rd.right-rd.left)/(rd.bottom-rd.top); | |
901 } | |
902 else | |
903 { | |
904 rd.right = rd.left+guiIntfStruct.MovieWidth; | |
905 rd.bottom = rd.top+guiIntfStruct.MovieHeight; | |
906 | |
907 if (movie_aspect > 0.0) // forced aspect from the cmdline | |
908 sub_aspect = movie_aspect; | |
909 } | |
910 | |
911 | |
912 AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); | |
913 SetWindowPos(mygui->subwindow, 0, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); | |
914 | |
915 wp.hwnd = mygui->subwindow; | |
916 wp.x = rd.left; | |
917 wp.y = rd.top; | |
918 wp.cx = rd.right-rd.left; | |
919 wp.cy = rd.bottom-rd.top; | |
920 wp.flags = SWP_NOOWNERZORDER | SWP_SHOWWINDOW; | |
921 | |
922 /* erase the bitmap image if there's video */ | |
923 if(guiIntfStruct.Playing != 0 && guiIntfStruct.sh_video) | |
924 SendMessage(mygui->subwindow, WM_ERASEBKGND, (WPARAM)GetDC(mygui->subwindow), 0); | |
925 | |
926 /* reset the window aspect */ | |
927 SendMessage(mygui->subwindow, WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp); | |
928 return 0; | |
929 } | |
930 | |
931 void guiEventHandling(void) {} |