Mercurial > mplayer.hg
annotate gui/ui/actions.c @ 35801:98693cc5df48
Exit GUI if we can't return to the skin we started with.
If there are errors in both the selected skin and the skin
we started with, there's nothing we can do but exit.
author | ib |
---|---|
date | Sat, 26 Jan 2013 00:34:43 +0000 |
parents | 6a7be705643b |
children | 25852c740093 |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
35437 | 19 /** |
20 * @file | |
21 * @brief User interface actions | |
22 */ | |
23 | |
23077 | 24 #include <stdlib.h> |
25 #include <string.h> | |
26 | |
33556 | 27 #include "actions.h" |
35528 | 28 #include "ui.h" |
35525 | 29 #include "gui/app/app.h" |
35771 | 30 #include "gui/app/cfg.h" |
35525 | 31 #include "gui/app/gui.h" |
35771 | 32 #include "gui/dialog/dialog.h" |
32881 | 33 #include "gui/interface.h" |
34 #include "gui/skin/skin.h" | |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33740
diff
changeset
|
35 #include "gui/util/list.h" |
33739 | 36 #include "gui/util/mem.h" |
33737 | 37 #include "gui/util/string.h" |
35435 | 38 #include "gui/wm/ws.h" |
32881 | 39 #include "gui/wm/wsxdnd.h" |
23077 | 40 |
35771 | 41 #include "access_mpcontext.h" |
42 #include "config.h" | |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
43 #include "help_mp.h" |
32881 | 44 #include "input/input.h" |
35771 | 45 #include "libmpcodecs/vd.h" |
35431 | 46 #include "libmpdemux/demuxer.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
47 #include "libvo/video_out.h" |
35771 | 48 #include "libvo/wskeys.h" |
49 #include "libvo/x11_common.h" | |
50 #include "m_property.h" | |
51 #include "mixer.h" | |
32881 | 52 #include "mp_core.h" |
35435 | 53 #include "mp_msg.h" |
35771 | 54 #include "mpcommon.h" |
35435 | 55 #include "mplayer.h" |
35771 | 56 #include "osdep/timer.h" |
57 #include "stream/stream.h" | |
58 #include "sub/sub.h" | |
59 | |
35776 | 60 #define GUI_REDRAW_WAIT 375 // in milliseconds |
35771 | 61 |
35777 | 62 int uiLoadPlay; |
63 | |
35775 | 64 static unsigned int last_redraw_time; |
35771 | 65 |
35776 | 66 /** |
67 * @brief Clear information not used for this @a type of stream. | |
68 * | |
69 * @param type stream type | |
70 */ | |
35771 | 71 static void MediumPrepare(int type) |
72 { | |
73 switch (type) { | |
74 case STREAMTYPE_DVD: | |
75 listMgr(PLAYLIST_DELETE, 0); | |
76 break; | |
77 | |
78 case STREAMTYPE_CDDA: | |
79 case STREAMTYPE_VCD: | |
80 listMgr(PLAYLIST_DELETE, 0); | |
81 case STREAMTYPE_FILE: | |
82 case STREAMTYPE_STREAM: | |
83 case STREAMTYPE_PLAYLIST: | |
84 guiInfo.AudioStreams = 0; | |
85 guiInfo.Subtitles = 0; | |
86 guiInfo.Chapters = 0; | |
87 guiInfo.Angles = 0; | |
88 break; | |
89 } | |
90 } | |
91 | |
35773 | 92 void uiEvent(int ev, float param) |
35771 | 93 { |
94 int iparam = (int)param, osd; | |
95 mixer_t *mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
96 | |
35773 | 97 switch (ev) { |
35771 | 98 /* user events */ |
99 case evExit: | |
100 mplayer(MPLAYER_EXIT_GUI, EXIT_QUIT, 0); | |
101 break; | |
102 | |
103 case evLoadURL: | |
104 gtkShow(evLoadURL, NULL); | |
105 break; | |
106 | |
107 case ivSetAudio: | |
108 | |
109 if (!mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam) | |
110 break; | |
111 | |
112 mp_property_do("switch_audio", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); | |
113 break; | |
114 | |
115 case ivSetVideo: | |
116 | |
117 if (!mpctx_get_demuxer(guiInfo.mpcontext) || video_id == iparam) | |
118 break; | |
119 | |
120 mp_property_do("switch_video", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); | |
121 break; | |
122 | |
123 case ivSetSubtitle: | |
124 mp_property_do("sub", M_PROPERTY_SET, &iparam, guiInfo.mpcontext); | |
125 break; | |
126 | |
127 #ifdef CONFIG_CDDA | |
128 case ivSetCDTrack: | |
129 guiInfo.Track = iparam; | |
130 | |
131 case evPlayCD: | |
132 guiInfo.StreamType = STREAMTYPE_CDDA; | |
133 goto play; | |
134 | |
135 #endif | |
136 #ifdef CONFIG_VCD | |
137 case ivSetVCDTrack: | |
138 guiInfo.Track = iparam; | |
139 | |
140 case evPlayVCD: | |
141 guiInfo.StreamType = STREAMTYPE_VCD; | |
142 goto play; | |
143 | |
144 #endif | |
145 #ifdef CONFIG_DVDREAD | |
146 case ivSetDVDSubtitle: | |
147 dvdsub_id = iparam; | |
35773 | 148 uiEvent(ivPlayDVD, 0); |
35771 | 149 break; |
150 | |
151 case ivSetDVDAudio: | |
152 audio_id = iparam; | |
35773 | 153 uiEvent(ivPlayDVD, 0); |
35771 | 154 break; |
155 | |
156 case ivSetDVDChapter: | |
157 guiInfo.Chapter = iparam; | |
35773 | 158 uiEvent(ivPlayDVD, 0); |
35771 | 159 break; |
160 | |
161 case ivSetDVDTitle: | |
162 guiInfo.Track = iparam; | |
163 guiInfo.Chapter = 1; | |
164 guiInfo.Angle = 1; | |
35773 | 165 uiEvent(ivPlayDVD, 0); |
35771 | 166 break; |
167 | |
168 case evPlayDVD: | |
169 guiInfo.Chapter = 1; | |
170 guiInfo.Angle = 1; | |
171 | |
172 case ivPlayDVD: | |
173 guiInfo.StreamType = STREAMTYPE_DVD; | |
174 goto play; | |
175 | |
176 #endif | |
177 case evPlay: | |
178 case evPlaySwitchToPause: | |
179 play: | |
180 | |
35791 | 181 if (guiInfo.Playing != GUI_PAUSE) { |
35792 | 182 MediumPrepare(guiInfo.StreamType); |
35771 | 183 |
35792 | 184 switch (guiInfo.StreamType) { |
185 case STREAMTYPE_FILE: | |
186 case STREAMTYPE_STREAM: | |
187 case STREAMTYPE_PLAYLIST: | |
35771 | 188 |
35792 | 189 if (!guiInfo.Track) |
190 guiInfo.Track = 1; | |
35771 | 191 |
35792 | 192 guiInfo.NewPlay = GUI_FILE_NEW; |
193 guiInfo.PlaylistNext = !guiInfo.Playing; | |
35791 | 194 |
35792 | 195 break; |
35771 | 196 |
35792 | 197 case STREAMTYPE_CDDA: |
198 case STREAMTYPE_VCD: | |
199 case STREAMTYPE_DVD: | |
35771 | 200 |
201 if (!guiInfo.Track) | |
35793 | 202 guiInfo.Track = (guiInfo.StreamType == STREAMTYPE_VCD ? 2 : 1); |
35771 | 203 |
204 guiInfo.NewPlay = GUI_FILE_SAME; | |
205 | |
35792 | 206 break; |
207 } | |
35791 | 208 } |
35771 | 209 |
210 uiPlay(); | |
211 break; | |
212 | |
213 case evPause: | |
214 case evPauseSwitchToPlay: | |
215 uiPause(); | |
216 break; | |
217 | |
218 case evStop: | |
219 guiInfo.Playing = GUI_STOP; | |
220 uiState(); | |
221 break; | |
222 | |
223 case evLoadPlay: | |
224 uiLoadPlay = True; | |
225 | |
226 // guiInfo.StreamType=STREAMTYPE_FILE; | |
227 case evLoad: | |
228 gtkShow(evLoad, NULL); | |
229 break; | |
230 | |
231 case evLoadSubtitle: | |
232 gtkShow(evLoadSubtitle, NULL); | |
233 break; | |
234 | |
235 case evDropSubtitle: | |
236 nfree(guiInfo.SubtitleFilename); | |
237 mplayerLoadSubtitle(NULL); | |
238 break; | |
239 | |
240 case evLoadAudioFile: | |
241 gtkShow(evLoadAudioFile, NULL); | |
242 break; | |
243 | |
244 case evPrev: | |
245 uiPrev(); | |
246 break; | |
247 | |
248 case evNext: | |
249 uiNext(); | |
250 break; | |
251 | |
252 case evPlaylist: | |
253 gtkShow(evPlaylist, NULL); | |
254 break; | |
255 | |
256 case evSkinBrowser: | |
257 gtkShow(evSkinBrowser, skinName); | |
258 break; | |
259 | |
260 case evAbout: | |
261 gtkShow(evAbout, NULL); | |
262 break; | |
263 | |
264 case evPreferences: | |
265 gtkShow(evPreferences, NULL); | |
266 break; | |
267 | |
268 case evEqualizer: | |
269 gtkShow(evEqualizer, NULL); | |
270 break; | |
271 | |
272 case evForward10min: | |
273 uiRelSeek(600); | |
274 break; | |
275 | |
276 case evBackward10min: | |
277 uiRelSeek(-600); | |
278 break; | |
279 | |
280 case evForward1min: | |
281 uiRelSeek(60); | |
282 break; | |
283 | |
284 case evBackward1min: | |
285 uiRelSeek(-60); | |
286 break; | |
287 | |
288 case evForward10sec: | |
289 uiRelSeek(10); | |
290 break; | |
291 | |
292 case evBackward10sec: | |
293 uiRelSeek(-10); | |
294 break; | |
295 | |
296 case evSetMoviePosition: | |
297 uiAbsSeek(param); | |
298 break; | |
299 | |
300 case evIncVolume: | |
301 vo_x11_putkey(wsGrayMul); | |
302 break; | |
303 | |
304 case evDecVolume: | |
305 vo_x11_putkey(wsGrayDiv); | |
306 break; | |
307 | |
308 case evMute: | |
309 mixer_mute(mixer); | |
310 break; | |
311 | |
312 case evSetVolume: | |
313 guiInfo.Volume = param; | |
314 { | |
315 float l = guiInfo.Volume * ((100.0 - guiInfo.Balance) / 50.0); | |
316 float r = guiInfo.Volume * ((guiInfo.Balance) / 50.0); | |
317 mixer_setvolume(mixer, FFMIN(l, guiInfo.Volume), FFMIN(r, guiInfo.Volume)); | |
318 } | |
319 | |
320 if (osd_level) { | |
321 osd_visible = (GetTimerMS() + 1000) | 1; | |
322 vo_osd_progbar_type = OSD_VOLUME; | |
323 vo_osd_progbar_value = ((guiInfo.Volume) * 256.0) / 100.0; | |
324 vo_osd_changed(OSDTYPE_PROGBAR); | |
325 } | |
326 | |
327 break; | |
328 | |
329 case evSetBalance: | |
330 guiInfo.Balance = param; | |
331 mixer_setbalance(mixer, (guiInfo.Balance - 50.0) / 50.0); // transform 0..100 to -1..1 | |
332 osd = osd_level; | |
333 osd_level = 0; | |
35773 | 334 uiEvent(evSetVolume, guiInfo.Volume); |
35771 | 335 osd_level = osd; |
336 | |
337 if (osd_level) { | |
338 osd_visible = (GetTimerMS() + 1000) | 1; | |
339 vo_osd_progbar_type = OSD_BALANCE; | |
340 vo_osd_progbar_value = ((guiInfo.Balance) * 256.0) / 100.0; | |
341 vo_osd_changed(OSDTYPE_PROGBAR); | |
342 } | |
343 | |
344 break; | |
345 | |
346 case evMenu: | |
347 /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Uncomment only after mouse | |
348 * { pointer and cursor keys work | |
349 * gtkShow( ivHidePopUpMenu,NULL ); with this menu from skin as | |
350 * uiMenuShow( 0,0 ); they do with normal menus. | |
351 * } | |
352 * else*/gtkShow(ivShowPopUpMenu, NULL); | |
353 break; | |
354 | |
355 case evIconify: | |
356 | |
357 switch (iparam) { | |
358 case 0: | |
359 wsWindowIconify(&guiApp.mainWindow); | |
360 break; | |
361 | |
362 case 1: | |
363 wsWindowIconify(&guiApp.videoWindow); | |
364 break; | |
365 } | |
366 | |
367 break; | |
368 | |
369 case evHalfSize: | |
370 | |
371 if (guiInfo.VideoWindow && guiInfo.Playing) { | |
372 if (guiApp.videoWindow.isFullScreen) { | |
373 uiFullScreen(); | |
374 } | |
375 | |
376 wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2); | |
377 btnSet(evFullScreen, btnReleased); | |
378 } | |
379 | |
380 break; | |
381 | |
382 case evDoubleSize: | |
383 | |
384 if (guiInfo.VideoWindow && guiInfo.Playing) { | |
385 if (guiApp.videoWindow.isFullScreen) { | |
386 uiFullScreen(); | |
387 } | |
388 | |
389 wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2); | |
390 wsWindowMoveWithin(&guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y); | |
391 btnSet(evFullScreen, btnReleased); | |
392 } | |
393 | |
394 break; | |
395 | |
396 case evNormalSize: | |
397 | |
398 if (guiInfo.VideoWindow && guiInfo.Playing) { | |
399 if (guiApp.videoWindow.isFullScreen) { | |
400 uiFullScreen(); | |
401 } | |
402 | |
403 wsWindowResize(&guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight); | |
404 btnSet(evFullScreen, btnReleased); | |
405 break; | |
406 } else if (!guiApp.videoWindow.isFullScreen) | |
407 break; | |
408 | |
409 case evFullScreen: | |
410 | |
411 if (guiInfo.VideoWindow && (guiInfo.Playing || !iparam)) { | |
412 uiFullScreen(); | |
413 | |
414 if (!guiApp.videoWindow.isFullScreen) | |
415 wsWindowResize(&guiApp.videoWindow, iparam ? guiInfo.VideoWidth : guiApp.video.width, iparam ? guiInfo.VideoHeight : guiApp.video.height); | |
416 } | |
417 | |
418 if (guiApp.videoWindow.isFullScreen) | |
419 btnSet(evFullScreen, btnPressed); | |
420 else | |
421 btnSet(evFullScreen, btnReleased); | |
422 | |
423 break; | |
424 | |
425 case evSetAspect: | |
426 | |
427 switch (iparam) { | |
428 case 2: | |
429 movie_aspect = 16.0f / 9.0f; | |
430 break; | |
431 | |
432 case 3: | |
433 movie_aspect = 4.0f / 3.0f; | |
434 break; | |
435 | |
436 case 4: | |
437 movie_aspect = 2.35; | |
438 break; | |
439 | |
440 case 1: | |
441 default: | |
442 movie_aspect = -1; | |
443 } | |
444 | |
445 if (guiInfo.StreamType == STREAMTYPE_VCD) | |
35773 | 446 uiEvent(evPlayVCD, 0); |
35771 | 447 else if (guiInfo.StreamType == STREAMTYPE_DVD) |
35773 | 448 uiEvent(ivPlayDVD, 0); |
35771 | 449 else |
450 guiInfo.NewPlay = GUI_FILE_NEW; | |
451 | |
452 break; | |
453 | |
454 /* timer events */ | |
455 case ivRedraw: | |
456 { | |
35775 | 457 unsigned int now = GetTimerMS(); |
35771 | 458 |
459 if ((now > last_redraw_time) && | |
460 (now < last_redraw_time + GUI_REDRAW_WAIT) && | |
461 !uiPlaybarFade && (iparam == 0)) | |
462 break; | |
463 | |
464 last_redraw_time = now; | |
465 } | |
466 uiMainRender = True; | |
467 wsWindowRedraw(&guiApp.mainWindow); | |
468 wsWindowRedraw(&guiApp.playbarWindow); | |
469 break; | |
470 | |
471 /* system events */ | |
472 case evNone: | |
35773 | 473 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[actions] uiEvent: evNone\n"); |
35771 | 474 break; |
475 | |
476 default: | |
35773 | 477 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[actions] uiEvent: unknown event %d, param %.2f\n", ev, param); |
35771 | 478 break; |
479 } | |
480 } | |
23077 | 481 |
35437 | 482 /** |
483 * @brief Switch video window fullscreen mode. | |
484 * | |
485 * Switch normal video to fullscreen and fullscreen video to normal. | |
486 */ | |
33555 | 487 void uiFullScreen(void) |
23077 | 488 { |
33960 | 489 if (!guiInfo.VideoWindow) |
32881 | 490 return; |
491 | |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
492 wsWindowFullscreen(&guiApp.videoWindow); |
23077 | 493 |
34697 | 494 vo_fs = guiApp.videoWindow.isFullScreen; |
23077 | 495 |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
496 wsWindowLayer(wsDisplay, guiApp.mainWindow.WindowID, guiApp.videoWindow.isFullScreen); |
32881 | 497 |
33555 | 498 if (guiApp.menuIsPresent) |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
499 wsWindowLayer(wsDisplay, guiApp.menuWindow.WindowID, guiApp.videoWindow.isFullScreen); |
23077 | 500 } |
501 | |
35437 | 502 /** |
503 * @brief Switch to play mode. | |
504 */ | |
33555 | 505 void uiPlay(void) |
23077 | 506 { |
34401
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
507 if (guiInfo.Playing == GUI_PLAY) |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
508 return; |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
509 |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
510 if (guiInfo.StreamType != STREAMTYPE_CDDA && |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
511 guiInfo.StreamType != STREAMTYPE_VCD && |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
512 guiInfo.StreamType != STREAMTYPE_DVD && |
af8838c2b60b
Allow uiPlay() without guiInfo.Filename for some stream types.
ib
parents:
34400
diff
changeset
|
513 (!guiInfo.Filename || (guiInfo.Filename[0] == 0))) |
32881 | 514 return; |
23077 | 515 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
516 if (guiInfo.Playing == GUI_PAUSE) { |
33555 | 517 uiPause(); |
32881 | 518 return; |
519 } | |
520 | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33725
diff
changeset
|
521 gui(GUI_SET_STATE, (void *)GUI_PLAY); |
23077 | 522 } |
523 | |
35437 | 524 /** |
525 * @brief Switch to pause mode. | |
526 */ | |
33555 | 527 void uiPause(void) |
23077 | 528 { |
33555 | 529 if (!guiInfo.Playing) |
32881 | 530 return; |
531 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
532 if (guiInfo.Playing == GUI_PLAY) { |
32881 | 533 mp_cmd_t *cmd = calloc(1, sizeof(*cmd)); |
35433 | 534 |
35432 | 535 if (cmd) { |
35433 | 536 cmd->id = MP_CMD_PAUSE; |
537 cmd->name = strdup("pause"); | |
538 mp_input_queue_cmd(cmd); | |
35432 | 539 } |
32881 | 540 } else |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
541 guiInfo.Playing = GUI_PLAY; |
23077 | 542 } |
543 | |
35437 | 544 /** |
545 * @brief Adjust GUI items to reflect current state (i.e. current playing mode). | |
546 */ | |
33555 | 547 void uiState(void) |
32881 | 548 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
549 if (guiInfo.Playing == GUI_STOP || guiInfo.Playing == GUI_PAUSE) { |
33978 | 550 btnSet(evPlaySwitchToPause, btnReleased); |
551 btnSet(evPauseSwitchToPlay, btnDisabled); | |
32881 | 552 } else { |
35434 | 553 btnSet(evPauseSwitchToPlay, btnReleased); |
33978 | 554 btnSet(evPlaySwitchToPause, btnDisabled); |
32881 | 555 } |
23077 | 556 } |
557 | |
35437 | 558 /** |
559 * @brief Seek new playback position. | |
560 * | |
35438 | 561 * The new position is a relative one. |
35437 | 562 * |
563 * @param sec seconds to seek (either forward (> 0) or backward (< 0)) | |
564 */ | |
33555 | 565 void uiRelSeek(float sec) |
32881 | 566 { |
32971 | 567 rel_seek_secs = sec; |
32881 | 568 abs_seek_pos = 0; |
569 } | |
570 | |
35437 | 571 /** |
572 * @brief Seek new playback position. | |
573 * | |
35438 | 574 * The new position is an absolute one. |
35437 | 575 * |
576 * @param percent percentage of playback time to position to | |
577 */ | |
33555 | 578 void uiAbsSeek(float percent) |
32881 | 579 { |
32971 | 580 rel_seek_secs = percent / 100.0; |
35431 | 581 abs_seek_pos = SEEK_ABSOLUTE | SEEK_FACTOR; |
23077 | 582 } |
583 | |
35437 | 584 /** |
585 * @brief Change to a different skin. | |
586 * | |
587 * @param name name of the skin to change to | |
588 */ | |
33555 | 589 void uiChangeSkin(char *name) |
23077 | 590 { |
35799 | 591 int was_menu, was_playbar; |
32881 | 592 |
35799 | 593 was_menu = guiApp.menuIsPresent; |
594 was_playbar = guiApp.playbarIsPresent; | |
32881 | 595 |
35493 | 596 mainVisible = False; |
32881 | 597 |
32893 | 598 if (skinRead(name) != 0) { |
599 if (skinRead(skinName) != 0) { | |
35801
98693cc5df48
Exit GUI if we can't return to the skin we started with.
ib
parents:
35800
diff
changeset
|
600 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_SKIN_SKINCFG_SkinCfgError, skinName); |
98693cc5df48
Exit GUI if we can't return to the skin we started with.
ib
parents:
35800
diff
changeset
|
601 mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); |
32893 | 602 } |
32881 | 603 } |
604 | |
35800 | 605 /* reload main window (must be first!) */ |
23077 | 606 |
35800 | 607 uiMainDone(); |
608 uiMainInit(); | |
32881 | 609 |
35800 | 610 wsWindowVisibility(&guiApp.mainWindow, wsShowWindow); |
611 mainVisible = True; | |
23077 | 612 |
35800 | 613 /* reload video window (must be second!) */ |
23077 | 614 |
34697 | 615 if (guiApp.video.Bitmap.Image) |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
616 wsImageResize(&guiApp.videoWindow, guiApp.video.Bitmap.Width, guiApp.video.Bitmap.Height); |
32881 | 617 |
34697 | 618 if (!guiApp.videoWindow.isFullScreen && !guiInfo.Playing) { |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
619 wsWindowResize(&guiApp.videoWindow, guiApp.video.width, guiApp.video.height); |
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
620 wsWindowMove(&guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y); |
32881 | 621 } |
622 | |
34697 | 623 if (guiApp.video.Bitmap.Image) |
35744 | 624 wsImageRender(&guiApp.videoWindow, guiApp.video.Bitmap.Image); |
23077 | 625 |
35745 | 626 if (!guiInfo.Playing) |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
627 wsWindowRedraw(&guiApp.videoWindow); |
32881 | 628 |
34684 | 629 /* reload playbar */ |
32881 | 630 |
35799 | 631 if (was_playbar) |
35796
497a1c45a597
Add uiMainDone(), uiVideoDone(), uiPlaybarDone() and uiMenuDone().
ib
parents:
35795
diff
changeset
|
632 uiPlaybarDone(); |
32881 | 633 |
33555 | 634 uiPlaybarInit(); |
23077 | 635 |
35800 | 636 /* reload menu window */ |
637 | |
638 if (was_menu && guiApp.menuIsPresent) { | |
639 free(menuDrawBuffer); | |
640 menuDrawBuffer = calloc(1, guiApp.menu.Bitmap.ImageSize); | |
32881 | 641 |
35800 | 642 if (!menuDrawBuffer) { |
643 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_NEMDB); | |
644 mplayer(MPLAYER_EXIT_GUI, EXIT_ERROR, 0); | |
645 } | |
32881 | 646 |
35800 | 647 wsWindowResize(&guiApp.menuWindow, guiApp.menu.width, guiApp.menu.height); |
648 wsImageResize(&guiApp.menuWindow, guiApp.menu.width, guiApp.menu.height); | |
649 wsWindowShape(&guiApp.menuWindow, guiApp.menu.Mask.Image); | |
650 wsWindowVisibility(&guiApp.menuWindow, wsHideWindow); | |
651 } else | |
652 uiMenuInit(); | |
653 | |
654 /* */ | |
32881 | 655 |
33555 | 656 btnModify(evSetVolume, guiInfo.Volume); |
657 btnModify(evSetBalance, guiInfo.Balance); | |
658 btnModify(evSetMoviePosition, guiInfo.Position); | |
34697 | 659 btnSet(evFullScreen, (guiApp.videoWindow.isFullScreen ? btnPressed : btnReleased)); |
23077 | 660 |
35681
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
661 wsWindowLayer(wsDisplay, guiApp.mainWindow.WindowID, guiApp.videoWindow.isFullScreen); |
80c5c89f77d6
Cosmetic: Rename ws functions for the sake of consistency.
ib
parents:
35658
diff
changeset
|
662 wsWindowLayer(wsDisplay, guiApp.menuWindow.WindowID, guiApp.videoWindow.isFullScreen); |
32881 | 663 } |
664 | |
35437 | 665 /** |
35452 | 666 * @brief Set the file to be played. |
35437 | 667 * |
668 * @param dir directory (optional, else NULL) | |
669 * @param name filename | |
670 * @param type stream type of the file | |
35483
8ac7761bcb7c
Clear information associated with a file when setting a new one.
ib
parents:
35462
diff
changeset
|
671 * |
8ac7761bcb7c
Clear information associated with a file when setting a new one.
ib
parents:
35462
diff
changeset
|
672 * @note All #guiInfo members associated with the file will be cleared. |
35437 | 673 */ |
35452 | 674 void uiSetFile(char *dir, char *name, int type) |
32881 | 675 { |
676 if (!dir) | |
33740
2c02269701bd
Remove macros guiSetFilename() and guiSetDF() from interface.h.
ib
parents:
33739
diff
changeset
|
677 setdup(&guiInfo.Filename, name); |
32881 | 678 else |
33740
2c02269701bd
Remove macros guiSetFilename() and guiSetDF() from interface.h.
ib
parents:
33739
diff
changeset
|
679 setddup(&guiInfo.Filename, dir, name); |
23077 | 680 |
34064 | 681 filename = guiInfo.Filename; |
34399
f2c03009068d
Don't explicitly set stream type if the type doesn't change.
ib
parents:
34387
diff
changeset
|
682 |
35483
8ac7761bcb7c
Clear information associated with a file when setting a new one.
ib
parents:
35462
diff
changeset
|
683 if (type != SAME_STREAMTYPE) { |
34400 | 684 guiInfo.StreamType = type; |
35568 | 685 uiUnsetMedia(False); |
35483
8ac7761bcb7c
Clear information associated with a file when setting a new one.
ib
parents:
35462
diff
changeset
|
686 } |
23077 | 687 } |
688 | |
35437 | 689 /** |
35453 | 690 * @brief Unset the file being played. |
691 */ | |
692 void uiUnsetFile(void) | |
693 { | |
694 uiSetFile(NULL, NULL, STREAMTYPE_DUMMY); | |
695 } | |
696 | |
697 /** | |
35562 | 698 * @brief Unset media information. |
35568 | 699 * |
700 * @param totals whether to unset number of chapters and angles (#True) or | |
701 * just track, chapter and angle (#False) as well | |
35562 | 702 */ |
35568 | 703 void uiUnsetMedia(int totals) |
35562 | 704 { |
705 guiInfo.VideoWidth = 0; | |
706 guiInfo.VideoHeight = 0; | |
707 guiInfo.AudioChannels = 0; | |
708 guiInfo.RunningTime = 0; | |
35568 | 709 |
710 if (totals) { | |
711 guiInfo.Chapters = 0; | |
712 guiInfo.Angles = 0; | |
713 } else { | |
35569 | 714 guiInfo.Track = 0; |
715 guiInfo.Chapter = 0; | |
716 guiInfo.Angle = 0; | |
35568 | 717 } |
35562 | 718 |
719 nfree(guiInfo.CodecName); | |
720 nfree(guiInfo.AudioFilename); | |
721 nfree(guiInfo.SubtitleFilename); | |
722 } | |
723 | |
724 /** | |
35437 | 725 * @brief Set file to be played to current playlist entry. |
726 */ | |
33555 | 727 void uiCurr(void) |
23077 | 728 { |
32881 | 729 plItem *curr; |
23077 | 730 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
731 if (guiInfo.Playing == GUI_PAUSE) |
32881 | 732 return; |
23077 | 733 |
33555 | 734 switch (guiInfo.StreamType) { |
34387 | 735 case STREAMTYPE_CDDA: |
34077 | 736 case STREAMTYPE_VCD: |
737 case STREAMTYPE_DVD: | |
35433 | 738 |
32881 | 739 break; |
740 | |
741 default: | |
742 | |
34663 | 743 curr = listMgr(PLAYLIST_ITEM_GET_CURR, 0); |
32881 | 744 |
745 if (curr) { | |
35452 | 746 uiSetFile(curr->path, curr->name, STREAMTYPE_FILE); |
35493 | 747 guiInfo.PlaylistNext = False; |
35485 | 748 guiInfo.Track = (int)listMgr(PLAYLIST_ITEM_GET_POS, curr); |
32881 | 749 break; |
750 } | |
751 | |
752 return; | |
753 } | |
754 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
755 if (guiInfo.Playing == GUI_PLAY) |
35773 | 756 uiEvent(evPlay, 0); |
23077 | 757 } |
758 | |
35437 | 759 /** |
760 * @brief Switch to previous playback track. | |
761 */ | |
33555 | 762 void uiPrev(void) |
23077 | 763 { |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
764 int stop = False, unset = True; |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
765 plItem *prev = NULL; |
32881 | 766 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
767 if (guiInfo.Playing == GUI_PAUSE) |
32881 | 768 return; |
769 | |
33555 | 770 switch (guiInfo.StreamType) { |
34387 | 771 case STREAMTYPE_CDDA: |
35426 | 772 |
34387 | 773 if (--guiInfo.Track == 0) { |
774 guiInfo.Track = 1; | |
35493 | 775 stop = True; |
34387 | 776 } |
35426 | 777 |
34387 | 778 break; |
779 | |
34077 | 780 case STREAMTYPE_VCD: |
35426 | 781 |
34077 | 782 if (--guiInfo.Track == 1) { |
783 guiInfo.Track = 2; | |
35493 | 784 stop = True; |
34077 | 785 } |
35426 | 786 |
34077 | 787 break; |
788 | |
32881 | 789 case STREAMTYPE_DVD: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
790 |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
791 if (--guiInfo.Chapter == 0) { |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
792 guiInfo.Chapter = 1; |
32881 | 793 |
35428 | 794 if (--guiInfo.Track == 0) { |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
795 guiInfo.Track = 1; |
35493 | 796 stop = True; |
32881 | 797 } |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
798 } else |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
799 unset = False; |
32881 | 800 |
801 break; | |
802 | |
803 default: | |
804 | |
34663 | 805 prev = listMgr(PLAYLIST_ITEM_GET_PREV, 0); |
32881 | 806 |
807 if (prev) { | |
35452 | 808 uiSetFile(prev->path, prev->name, STREAMTYPE_FILE); |
35500 | 809 guiInfo.PlaylistNext = !guiInfo.Playing; |
35458 | 810 guiInfo.Track = (int)listMgr(PLAYLIST_ITEM_GET_POS, prev); |
32881 | 811 break; |
812 } | |
813 | |
814 return; | |
815 } | |
816 | |
817 if (stop) | |
35773 | 818 uiEvent(evStop, 0); |
32881 | 819 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
820 if (guiInfo.Playing == GUI_PLAY) |
35773 | 821 uiEvent(evPlay, 0); |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
822 else if (!stop && !prev && unset) |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
823 uiUnsetMedia(True); |
23077 | 824 } |
825 | |
35437 | 826 /** |
827 * @brief Switch to next playback track. | |
828 */ | |
33555 | 829 void uiNext(void) |
23077 | 830 { |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
831 int stop = False, unset = True; |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
832 plItem *next = NULL; |
23077 | 833 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
834 if (guiInfo.Playing == GUI_PAUSE) |
32881 | 835 return; |
836 | |
33555 | 837 switch (guiInfo.StreamType) { |
34387 | 838 case STREAMTYPE_CDDA: |
35425 | 839 case STREAMTYPE_VCD: |
34387 | 840 |
841 if (++guiInfo.Track > guiInfo.Tracks) { | |
842 guiInfo.Track = guiInfo.Tracks; | |
35493 | 843 stop = True; |
34387 | 844 } |
845 | |
846 break; | |
847 | |
32881 | 848 case STREAMTYPE_DVD: |
849 | |
35570 | 850 if (guiInfo.Chapter++ >= guiInfo.Chapters) { |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
851 guiInfo.Chapter = 1; |
32881 | 852 |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
853 if (++guiInfo.Track > guiInfo.Tracks) { |
35561 | 854 guiInfo.Track = guiInfo.Tracks; |
35560
1a2200a93ea8
Make DVD stop if manually advancing beyond last chapter of last track.
ib
parents:
35528
diff
changeset
|
855 guiInfo.Chapter = guiInfo.Chapters; |
35493 | 856 stop = True; |
32881 | 857 } |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
858 } else |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
859 unset = False; |
32881 | 860 |
861 break; | |
862 | |
863 default: | |
864 | |
34663 | 865 next = listMgr(PLAYLIST_ITEM_GET_NEXT, 0); |
32881 | 866 |
867 if (next) { | |
35452 | 868 uiSetFile(next->path, next->name, STREAMTYPE_FILE); |
35500 | 869 guiInfo.PlaylistNext = !guiInfo.Playing; |
35458 | 870 guiInfo.Track = (int)listMgr(PLAYLIST_ITEM_GET_POS, next); |
32881 | 871 break; |
872 } | |
873 | |
874 return; | |
875 } | |
876 | |
877 if (stop) | |
35773 | 878 uiEvent(evStop, 0); |
32881 | 879 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
880 if (guiInfo.Playing == GUI_PLAY) |
35773 | 881 uiEvent(evPlay, 0); |
35571
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
882 else if (!stop && !next && unset) |
29761b2b8cb0
Reset media information while changing tracks in stop mode.
ib
parents:
35570
diff
changeset
|
883 uiUnsetMedia(True); |
23077 | 884 } |