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