Mercurial > mplayer.hg
annotate gui/win32/interface.c @ 33614:79743a5cf4f0
Rename the symbolic playback state constants.
They should not be confused with the guiGetEvent types.
Upper case charcaters shall reflect that they are (integer) constants.
Additionally, adjust their casts.
author | ib |
---|---|
date | Wed, 22 Jun 2011 12:12:50 +0000 |
parents | 6aa251adfba0 |
children | 1f9a31d4f114 |
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" |
33557 | 51 #include "gui/ui/gmplayer.h" |
30558 | 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; | |
33555 | 64 int uiGotoTheNext = 1; |
23077 | 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 */ | |
33579 | 121 static void greplace(char ***list, char *search, char *replace) |
23077 | 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 { | |
33555 | 149 if(guiInfo.mpcontext) |
150 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
23077 | 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: |
33555 | 157 uiPlay(); |
23077 | 158 break; |
159 case evPause: | |
33555 | 160 uiPause(); |
23077 | 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]; | |
33555 | 166 guiInfo.DVD.current_title = dvd_title; |
167 guiInfo.DVD.current_chapter = dvd_chapter; | |
168 guiInfo.DVD.current_angle = dvd_angle; | |
169 guiInfo.DiskChanged = 1; | |
23077 | 170 |
33555 | 171 uiSetFileName(NULL, dvd_device, STREAMTYPE_DVD); |
23077 | 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); | |
33595 | 177 guiGetEvent(guiSetParameters, (void *) STREAMTYPE_DVD); |
23077 | 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: | |
33555 | 220 if(guiInfo.Playing) |
33614 | 221 guiGetEvent(guiSetState, (void *) GUI_STOP); |
23077 | 222 break; |
223 case evSetMoviePosition: | |
224 { | |
33555 | 225 rel_seek_secs = guiInfo.Position / 100.0f; |
23077 | 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 | |
33555 | 246 if (guiInfo.Playing == 0) |
23077 | 247 break; |
248 | |
33555 | 249 if (guiInfo.Balance == 50.0f) |
250 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); | |
23077 | 251 |
33555 | 252 l = guiInfo.Volume * ((100.0f - guiInfo.Balance) / 50.0f); |
253 r = guiInfo.Volume * ((guiInfo.Balance) / 50.0f); | |
23077 | 254 |
33555 | 255 if (l > guiInfo.Volume) l=guiInfo.Volume; |
256 if (r > guiInfo.Volume) r=guiInfo.Volume; | |
23077 | 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"); | |
33555 | 265 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); |
266 guiInfo.Balance = 50.0f; | |
23077 | 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 { | |
33555 | 282 switch(guiInfo.StreamType) |
23077 | 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 { | |
33555 | 287 guiInfo.Title = guiInfo.DVD.current_title; |
288 guiInfo.Chapter = guiInfo.DVD.current_chapter; | |
289 guiInfo.Angle = guiInfo.DVD.current_angle; | |
290 guiInfo.DiskChanged = 1; | |
33614 | 291 guiGetEvent(guiSetState, (void *) GUI_PLAY); |
23077 | 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 { | |
33555 | 297 guiInfo.FilenameChanged = guiInfo.NewPlay = 1; |
23077 | 298 update_playlistwindow(); |
33555 | 299 uiGotoTheNext = guiInfo.Playing? 0 : 1; |
33614 | 300 guiGetEvent(guiSetState, (void *) GUI_STOP); |
301 guiGetEvent(guiSetState, (void *) GUI_PLAY); | |
23077 | 302 break; |
303 } | |
304 } | |
305 break; | |
306 } | |
307 case evNext: | |
33555 | 308 uiNext(); |
23077 | 309 break; |
310 case evPrev: | |
33555 | 311 uiPrev(); |
23077 | 312 break; |
313 } | |
314 } | |
315 | |
33555 | 316 void uiPlay( void ) |
23077 | 317 { |
33555 | 318 if((!guiInfo.Filename ) || (guiInfo.Filename[0] == 0)) |
23077 | 319 return; |
320 | |
33555 | 321 if(guiInfo.Playing > 0) |
23077 | 322 { |
33555 | 323 uiPause(); |
23077 | 324 return; |
325 } | |
33555 | 326 guiInfo.NewPlay = 1; |
33614 | 327 guiGetEvent(guiSetState, (void *) GUI_PLAY); |
23077 | 328 } |
329 | |
33555 | 330 void uiPause( void ) |
23077 | 331 { |
33555 | 332 if(!guiInfo.Playing) return; |
23077 | 333 |
33555 | 334 if(guiInfo.Playing == 1) |
23077 | 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); | |
33555 | 340 } else guiInfo.Playing = 1; |
23077 | 341 } |
342 | |
33555 | 343 void uiNext(void) |
23077 | 344 { |
33555 | 345 if(guiInfo.Playing == 2) return; |
346 switch(guiInfo.StreamType) | |
23077 | 347 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
348 #ifdef CONFIG_DVDREAD |
23077 | 349 case STREAMTYPE_DVD: |
33555 | 350 if(guiInfo.DVD.current_chapter == (guiInfo.DVD.chapters - 1)) |
23077 | 351 return; |
33555 | 352 guiInfo.DVD.current_chapter++; |
23077 | 353 break; |
354 #endif | |
355 default: | |
356 if(mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
357 return; | |
33555 | 358 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, |
23077 | 359 STREAMTYPE_STREAM); |
360 break; | |
361 } | |
362 mygui->startplay(mygui); | |
363 } | |
364 | |
33555 | 365 void uiPrev(void) |
23077 | 366 { |
33555 | 367 if(guiInfo.Playing == 2) return; |
368 switch(guiInfo.StreamType) | |
23077 | 369 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
370 #ifdef CONFIG_DVDREAD |
23077 | 371 case STREAMTYPE_DVD: |
33555 | 372 if(guiInfo.DVD.current_chapter == 1) |
23077 | 373 return; |
33555 | 374 guiInfo.DVD.current_chapter--; |
23077 | 375 break; |
376 #endif | |
377 default: | |
378 if(mygui->playlist->current == 0) | |
379 return; | |
33555 | 380 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)--]->filename, |
23077 | 381 STREAMTYPE_STREAM); |
382 break; | |
383 } | |
384 mygui->startplay(mygui); | |
385 } | |
386 | |
33555 | 387 void uiEnd( void ) |
23077 | 388 { |
33555 | 389 if(!uiGotoTheNext && guiInfo.Playing) |
23077 | 390 { |
33555 | 391 uiGotoTheNext = 1; |
23077 | 392 return; |
393 } | |
394 | |
33555 | 395 if(uiGotoTheNext && guiInfo.Playing && |
23077 | 396 (mygui->playlist->current < (mygui->playlist->trackcount - 1)) && |
33555 | 397 guiInfo.StreamType != STREAMTYPE_DVD && |
398 guiInfo.StreamType != STREAMTYPE_DVDNAV) | |
23077 | 399 { |
400 /* we've finished this file, reset the aspect */ | |
401 if(movie_aspect >= 0) | |
402 movie_aspect = -1; | |
403 | |
33555 | 404 uiGotoTheNext = guiInfo.FilenameChanged = guiInfo.NewPlay = 1; |
405 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, STREAMTYPE_STREAM); | |
406 //sprintf(guiInfo.Filename, mygui->playlist->tracks[(mygui->playlist->current)++]->filename); | |
23077 | 407 } |
408 | |
33555 | 409 if(guiInfo.FilenameChanged && guiInfo.NewPlay) |
23077 | 410 return; |
411 | |
33555 | 412 guiInfo.TimeSec = 0; |
413 guiInfo.Position = 0; | |
414 guiInfo.AudioType = 0; | |
23077 | 415 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
416 #ifdef CONFIG_DVDREAD |
33555 | 417 guiInfo.DVD.current_title = 1; |
418 guiInfo.DVD.current_chapter = 1; | |
419 guiInfo.DVD.current_angle = 1; | |
23077 | 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 } | |
33614 | 431 guiGetEvent(guiSetState, (void *) GUI_STOP); |
23077 | 432 } |
433 | |
33578 | 434 void uiStop(void) |
33567 | 435 { |
33614 | 436 guiGetEvent(guiSetState, (void *) GUI_STOP); |
33567 | 437 } |
438 | |
33555 | 439 void uiSetFileName(char *dir, char *name, int type) |
23077 | 440 { |
441 if(!name) return; | |
442 if(!dir) | |
33555 | 443 guiSetFilename(guiInfo.Filename, name) |
23077 | 444 else |
33555 | 445 guiSetDF(guiInfo.Filename, dir, name); |
23077 | 446 |
33555 | 447 guiInfo.StreamType = type; |
448 free(guiInfo.AudioFile); | |
449 guiInfo.AudioFile = NULL; | |
450 free(guiInfo.Subtitlename); | |
451 guiInfo.Subtitlename = NULL; | |
23077 | 452 } |
453 | |
33555 | 454 void uiFullScreen( void ) |
23077 | 455 { |
33555 | 456 if(!guiInfo.sh_video) return; |
23077 | 457 |
458 if(sub_window) | |
459 { | |
460 if(!fullscreen && IsWindowVisible(mygui->subwindow) && !IsIconic(mygui->subwindow)) | |
461 GetWindowRect(mygui->subwindow, &old_rect); | |
462 | |
463 if(fullscreen) | |
464 { | |
465 fullscreen = 0; | |
466 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
467 } else { | |
468 fullscreen = 1; | |
469 style = WS_VISIBLE | WS_POPUP; | |
470 } | |
471 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
472 update_subwindow(); | |
473 } | |
474 video_out->control(VOCTRL_FULLSCREEN, 0); | |
475 if(sub_window) ShowWindow(mygui->subwindow, SW_SHOW); | |
476 } | |
477 | |
24992 | 478 static unsigned __stdcall GuiThread(void* param) |
23077 | 479 { |
480 MSG msg; | |
481 | |
482 if(!skinName) skinName = strdup("Blue"); | |
483 if(!mygui) mygui = create_gui(get_path("skins"), skinName, guiSetEvent); | |
30558 | 484 if(!mygui) exit_player(EXIT_ERROR); |
23077 | 485 |
486 if(autosync && autosync != gtkAutoSync) | |
487 { | |
488 gtkAutoSyncOn = 1; | |
489 gtkAutoSync = autosync; | |
490 } | |
491 | |
24992 | 492 while(GetMessage(&msg, NULL, 0, 0)) |
23077 | 493 { |
494 TranslateMessage(&msg); | |
495 DispatchMessage(&msg); | |
496 } | |
23078 | 497 fprintf(stderr, "[GUI] GUI thread terminated.\n"); |
23077 | 498 fflush(stderr); |
499 return 0; | |
500 } | |
501 | |
502 void guiInit(void) | |
503 { | |
33555 | 504 memset(&guiInfo, 0, sizeof(guiInfo)); |
23077 | 505 /* Create The gui thread */ |
506 if (!mygui) | |
507 { | |
33358 | 508 hThread = _beginthreadex(NULL, 0, GuiThread, NULL, 0, &threadId); |
23077 | 509 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Creating GUI Thread 0x%04x\n", threadId); |
510 } | |
511 | |
512 /* Wait until the gui is created */ | |
513 while(!mygui) Sleep(100); | |
23078 | 514 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] GUI thread started.\n"); |
23077 | 515 } |
516 | |
517 void guiDone(void) | |
518 { | |
519 if(mygui) | |
520 { | |
521 fprintf(stderr, "[GUI] Closed by main mplayer window\n"); | |
522 fflush(stderr); | |
24992 | 523 PostThreadMessage(threadId, WM_QUIT, 0, 0); |
524 WaitForSingleObject(hThread, INFINITE); | |
525 CloseHandle(hThread); | |
23077 | 526 mygui->uninit(mygui); |
527 free(mygui); | |
528 mygui = NULL; | |
529 } | |
530 /* Remove tray icon */ | |
531 Shell_NotifyIcon(NIM_DELETE, &nid); | |
532 cfg_write(); | |
533 } | |
534 | |
535 /* 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
|
536 int guiGetEvent(int type, void *arg) |
23077 | 537 { |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
538 stream_t *stream = arg; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
539 #ifdef CONFIG_DVDREAD |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
540 dvd_priv_t *dvdp = arg; |
23077 | 541 #endif |
542 if(!mygui || !mygui->skin) return 0; | |
543 | |
33555 | 544 if(guiInfo.mpcontext) |
23077 | 545 { |
33555 | 546 audio_out = mpctx_get_audio_out(guiInfo.mpcontext); |
547 video_out = mpctx_get_video_out(guiInfo.mpcontext); | |
548 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
549 playtree = mpctx_get_playtree_iter(guiInfo.mpcontext); | |
23077 | 550 } |
551 | |
552 switch (type) | |
553 { | |
554 case guiSetFileFormat: | |
33555 | 555 guiInfo.FileFormat = (int) arg; |
23077 | 556 break; |
557 case guiSetParameters: | |
558 { | |
559 guiGetEvent(guiSetDefaults, NULL); | |
33555 | 560 guiInfo.DiskChanged = 0; |
561 guiInfo.FilenameChanged = 0; | |
562 guiInfo.NewPlay = 0; | |
563 switch(guiInfo.StreamType) | |
23077 | 564 { |
565 case STREAMTYPE_PLAYLIST: | |
566 break; | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
567 #ifdef CONFIG_DVDREAD |
23077 | 568 case STREAMTYPE_DVD: |
569 { | |
570 char tmp[512]; | |
33555 | 571 dvd_title = guiInfo.DVD.current_title; |
572 dvd_chapter = guiInfo.DVD.current_chapter; | |
573 dvd_angle = guiInfo.DVD.current_angle; | |
574 sprintf(tmp,"dvd://%d", guiInfo.Title); | |
575 guiSetFilename(guiInfo.Filename, tmp); | |
23077 | 576 break; |
577 } | |
578 #endif | |
579 } | |
33555 | 580 if(guiInfo.Filename) |
581 filename = strdup(guiInfo.Filename); | |
23077 | 582 else if(filename) |
33555 | 583 strcpy(guiInfo.Filename, filename); |
23077 | 584 break; |
585 } | |
586 case guiSetAudioOnly: | |
587 { | |
33555 | 588 guiInfo.AudioOnly = (int) arg; |
23077 | 589 if(IsWindowVisible(mygui->subwindow)) |
590 ShowWindow(mygui->subwindow, SW_HIDE); | |
591 break; | |
592 } | |
593 case guiSetContext: | |
33555 | 594 guiInfo.mpcontext = arg; |
23077 | 595 break; |
596 case guiSetDemuxer: | |
33555 | 597 guiInfo.demuxer = arg; |
23077 | 598 break; |
599 case guiSetValues: | |
600 { | |
33555 | 601 guiInfo.sh_video = arg; |
23077 | 602 if (arg) |
603 { | |
30722
b0342ca7ea61
Fix windows Gui compilation and remove some related typecasts.
reimar
parents:
30558
diff
changeset
|
604 sh_video_t *sh = arg; |
23077 | 605 codecname = sh->codec->name; |
33555 | 606 guiInfo.FPS = sh->fps; |
23077 | 607 |
608 /* we have video, show the subwindow */ | |
609 if(!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) | |
610 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); | |
611 if(WinID == -1) | |
612 update_subwindow(); | |
613 | |
614 } | |
615 break; | |
616 } | |
617 case guiSetShVideo: | |
618 { | |
33555 | 619 guiInfo.MovieWidth = vo_dwidth; |
620 guiInfo.MovieHeight = vo_dheight; | |
23077 | 621 |
33555 | 622 sub_aspect = (float)guiInfo.MovieWidth/guiInfo.MovieHeight; |
23077 | 623 if(WinID != -1) |
624 update_subwindow(); | |
625 break; | |
626 } | |
627 case guiSetStream: | |
628 { | |
33555 | 629 guiInfo.StreamType = stream->type; |
23077 | 630 switch(stream->type) |
631 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
632 #ifdef CONFIG_DVDREAD |
23077 | 633 case STREAMTYPE_DVD: |
33595 | 634 guiGetEvent(guiSetDVD, stream->priv); |
23077 | 635 break; |
636 #endif | |
637 } | |
638 break; | |
639 } | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
640 #ifdef CONFIG_DVDREAD |
23077 | 641 case guiSetDVD: |
642 { | |
33555 | 643 guiInfo.DVD.titles = dvdp->vmg_file->tt_srpt->nr_of_srpts; |
644 guiInfo.DVD.chapters = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
645 guiInfo.DVD.angles = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
646 guiInfo.DVD.nr_of_audio_channels = dvdp->nr_of_channels; | |
647 memcpy(guiInfo.DVD.audio_streams, dvdp->audio_streams, sizeof(dvdp->audio_streams)); | |
648 guiInfo.DVD.nr_of_subtitles = dvdp->nr_of_subtitles; | |
649 memcpy(guiInfo.DVD.subtitles, dvdp->subtitles, sizeof(dvdp->subtitles)); | |
650 guiInfo.DVD.current_title = dvd_title + 1; | |
651 guiInfo.DVD.current_chapter = dvd_chapter + 1; | |
652 guiInfo.DVD.current_angle = dvd_angle + 1; | |
653 guiInfo.Track = dvd_title + 1; | |
23077 | 654 break; |
655 } | |
656 #endif | |
657 case guiReDraw: | |
658 mygui->updatedisplay(mygui, mygui->mainwindow); | |
659 break; | |
660 case guiSetAfilter: | |
33555 | 661 guiInfo.afilter = arg; |
23077 | 662 break; |
33611 | 663 case guiSetState: |
23077 | 664 { |
33555 | 665 guiInfo.Playing = (int) arg; |
666 switch (guiInfo.Playing) | |
23077 | 667 { |
33614 | 668 case GUI_PLAY: |
23077 | 669 { |
33555 | 670 guiInfo.Playing = 1; |
23077 | 671 break; |
672 } | |
33614 | 673 case GUI_STOP: |
23077 | 674 { |
33555 | 675 guiInfo.Playing = 0; |
23077 | 676 if(movie_aspect >= 0) |
677 movie_aspect = -1; | |
678 update_subwindow(); | |
679 break; | |
680 } | |
33614 | 681 case GUI_PAUSE: |
33555 | 682 guiInfo.Playing = 2; |
23077 | 683 break; |
684 } | |
685 break; | |
686 } | |
687 case guiIEvent: | |
688 { | |
689 mp_msg(MSGT_GPLAYER,MSGL_V, "cmd: %d\n", (int) arg); | |
690 /* MPlayer asks us to quit */ | |
691 switch((int) arg) | |
692 { | |
31312
0b7792622c88
Remove Gui-specific slave commands and associated key-bindings and other code.
reimar
parents:
30901
diff
changeset
|
693 case MP_CMD_VO_FULLSCREEN: |
33555 | 694 uiFullScreen(); |
23077 | 695 break; |
696 case MP_CMD_QUIT: | |
697 { | |
698 mygui->uninit(mygui); | |
699 free(mygui); | |
700 mygui = NULL; | |
30558 | 701 exit_player(EXIT_QUIT); |
23077 | 702 return 0; |
703 } | |
704 default: | |
705 break; | |
706 } | |
707 break; | |
708 } | |
709 case guiSetFileName: | |
33555 | 710 if (arg) guiInfo.Filename = arg; |
23077 | 711 break; |
712 case guiSetDefaults: | |
713 { | |
714 audio_id = -1; | |
715 video_id = -1; | |
716 dvdsub_id = -1; | |
717 vobsub_id = -1; | |
718 stream_cache_size = -1; | |
719 autosync = 0; | |
720 dvd_title = 0; | |
721 force_fps = 0; | |
722 if(!mygui->playlist->tracks) return 0; | |
33555 | 723 filename = guiInfo.Filename = mygui->playlist->tracks[mygui->playlist->current]->filename; |
724 guiInfo.Track = mygui->playlist->current + 1; | |
23077 | 725 if(gtkAONorm) greplace(&af_cfg.list, "volnorm", "volnorm"); |
726 if(gtkAOExtraStereo) | |
727 { | |
728 char *name = malloc(12 + 20 + 1); | |
729 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
730 name[12 + 20] = 0; | |
731 greplace(&af_cfg.list, "extrastereo", name); | |
732 free(name); | |
733 } | |
734 if(gtkCacheOn) stream_cache_size = gtkCacheSize; | |
735 if(gtkAutoSyncOn) autosync = gtkAutoSync; | |
736 break; | |
737 } | |
738 case guiSetVolume: | |
739 { | |
740 if(audio_out) | |
741 { | |
742 /* Some audio_out drivers do not support balance e.g. dsound */ | |
743 /* FIXME this algo is not correct */ | |
744 float l, r; | |
745 mixer_getvolume(mixer, &l, &r); | |
33555 | 746 guiInfo.Volume = (r > l ? r : l); /* max(r,l) */ |
23077 | 747 if (r != l) |
33555 | 748 guiInfo.Balance = ((r-l) + 100.0f) * 0.5f; |
23077 | 749 else |
33555 | 750 guiInfo.Balance = 50.0f; |
23077 | 751 } |
752 break; | |
753 } | |
754 default: | |
755 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[GUI] GOT UNHANDLED EVENT %i\n", type); | |
756 } | |
757 return 0; | |
758 } | |
759 | |
760 /* This function adds/inserts one file into the gui playlist */ | |
33579 | 761 static int import_file_into_gui(char *pathname, int insert) |
23077 | 762 { |
763 char filename[MAX_PATH]; | |
764 char *filepart = filename; | |
765 | |
766 if (strstr(pathname, "://")) | |
767 { | |
768 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding special %s\n", pathname); | |
769 mygui->playlist->add_track(mygui->playlist, pathname, NULL, NULL, 0); | |
770 return 1; | |
771 } | |
772 if (GetFullPathName(pathname, MAX_PATH, filename, &filepart)) | |
773 { | |
774 if (!(GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY)) | |
775 { | |
776 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding filename: %s - fullpath: %s\n", filepart, filename); | |
777 mygui->playlist->add_track(mygui->playlist, filename, NULL, filepart, 0); | |
778 return 1; | |
779 } | |
780 else | |
781 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Cannot add %s\n", filename); | |
782 } | |
783 | |
784 return 0; | |
785 } | |
786 | |
787 /* This function imports the initial playtree (based on cmd-line files) into the gui playlist | |
788 by either: | |
789 - overwriting gui pl (enqueue=0) */ | |
790 | |
791 int import_initial_playtree_into_gui(play_tree_t *my_playtree, m_config_t *config, int enqueue) | |
792 { | |
793 play_tree_iter_t *my_pt_iter = NULL; | |
794 int result = 0; | |
795 | |
796 if(!mygui) guiInit(); | |
797 | |
798 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
799 { | |
800 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
801 { | |
802 if (parse_filename(filename, my_playtree, config, 0)) | |
803 result = 1; | |
804 else if (import_file_into_gui(filename, 0)) /* Add it to end of list */ | |
805 result = 1; | |
806 } | |
807 } | |
33555 | 808 uiGotoTheNext = 1; |
23077 | 809 |
810 if (result) | |
811 { | |
812 mygui->playlist->current = 0; | |
813 filename = mygui->playlist->tracks[0]->filename; | |
814 } | |
815 return result; | |
816 } | |
817 | |
818 /* This function imports and inserts an playtree, that is created "on the fly", for example by | |
819 parsing some MOV-Reference-File; or by loading an playlist with "File Open" | |
820 The file which contained the playlist is thereby replaced with it's contents. */ | |
821 | |
822 int import_playtree_playlist_into_gui(play_tree_t *my_playtree, m_config_t *config) | |
823 { | |
824 play_tree_iter_t *my_pt_iter = NULL; | |
825 int result = 0; | |
826 | |
827 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
828 { | |
829 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
830 if (import_file_into_gui(filename, 1)) /* insert it into the list and set plCurrent = new item */ | |
831 result = 1; | |
832 pt_iter_destroy(&my_pt_iter); | |
833 } | |
834 filename = NULL; | |
835 return result; | |
836 } | |
837 | |
33579 | 838 static inline void gtkMessageBox(int type, const char *str) |
23077 | 839 { |
840 if (type & GTK_MB_FATAL) | |
841 MessageBox(NULL, str, "MPlayer GUI for Windows Error", MB_OK | MB_ICONERROR); | |
842 | |
843 fprintf(stderr, "[GUI] MessageBox: %s\n", str); | |
844 fflush(stderr); | |
845 } | |
846 | |
847 static int update_subwindow(void) | |
848 { | |
849 int x,y; | |
850 RECT rd; | |
851 WINDOWPOS wp; | |
852 | |
853 if(!sub_window) | |
854 { | |
33567 | 855 WinID = -1; |
23077 | 856 |
33555 | 857 if(IsWindowVisible(mygui->subwindow) && guiInfo.sh_video && guiInfo.Playing) |
23077 | 858 { |
859 ShowWindow(mygui->subwindow, SW_HIDE); | |
860 return 0; | |
861 } | |
33555 | 862 else if(guiInfo.AudioOnly) |
23077 | 863 return 0; |
864 else ShowWindow(mygui->subwindow, SW_SHOW); | |
865 } | |
866 | |
867 /* we've come out of fullscreen at the end of file */ | |
33555 | 868 if((!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) && !guiInfo.AudioOnly) |
23077 | 869 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); |
870 | |
871 /* get our current window coordinates */ | |
872 GetWindowRect(mygui->subwindow, &rd); | |
873 | |
874 x = rd.left; | |
875 y = rd.top; | |
876 | |
877 /* restore sub window position when coming out of fullscreen */ | |
878 if(x <= 0) x = old_rect.left; | |
879 if(y <= 0) y = old_rect.top; | |
880 | |
33555 | 881 if(!guiInfo.Playing) |
23077 | 882 { |
883 window *desc = NULL; | |
884 int i; | |
885 | |
886 for (i=0; i<mygui->skin->windowcount; i++) | |
887 if(mygui->skin->windows[i]->type == wiSub) | |
888 desc = mygui->skin->windows[i]; | |
889 | |
890 rd.right = rd.left+desc->base->bitmap[0]->width; | |
891 rd.bottom = rd.top+desc->base->bitmap[0]->height; | |
892 sub_aspect = (float)(rd.right-rd.left)/(rd.bottom-rd.top); | |
893 } | |
894 else | |
895 { | |
33555 | 896 rd.right = rd.left+guiInfo.MovieWidth; |
897 rd.bottom = rd.top+guiInfo.MovieHeight; | |
23077 | 898 |
899 if (movie_aspect > 0.0) // forced aspect from the cmdline | |
900 sub_aspect = movie_aspect; | |
901 } | |
902 | |
903 | |
904 AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); | |
905 SetWindowPos(mygui->subwindow, 0, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); | |
906 | |
907 wp.hwnd = mygui->subwindow; | |
908 wp.x = rd.left; | |
909 wp.y = rd.top; | |
910 wp.cx = rd.right-rd.left; | |
911 wp.cy = rd.bottom-rd.top; | |
912 wp.flags = SWP_NOOWNERZORDER | SWP_SHOWWINDOW; | |
913 | |
914 /* erase the bitmap image if there's video */ | |
33555 | 915 if(guiInfo.Playing != 0 && guiInfo.sh_video) |
23077 | 916 SendMessage(mygui->subwindow, WM_ERASEBKGND, (WPARAM)GetDC(mygui->subwindow), 0); |
917 | |
918 /* reset the window aspect */ | |
919 SendMessage(mygui->subwindow, WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp); | |
920 return 0; | |
921 } | |
922 | |
923 void guiEventHandling(void) {} |