Mercurial > mplayer.hg
annotate gui/interface.c @ 33263:5f527a9a9521
Add an exit function.
This function will allow performing clean-up operations.
(MPlayer calls guiDone() before exiting, but only if the GUI has been
initialized, i.e. if guiInit() has been called successfully. Any
exit_player()/exit_player_with_rc() after GUI's cfg_read() until
guiInit(), or any exit_player() during guiInit() itself will end the GUI
without calling guiDone(). This exit function will at least handle
abortions during guiInit() itself. It will be called twice in case of an
guiExit() after GUI initialization - first directly, next by guiDone()
via MPlayer's exit_player_with_rc().)
author | ib |
---|---|
date | Tue, 03 May 2011 12:19:22 +0000 |
parents | cee07c3dbff5 |
children | 62c0471bcf8c |
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 |
19 #include <stdlib.h> | |
20 #include <string.h> | |
21 | |
32984 | 22 #include "interface.h" |
23 #include "app.h" | |
24 #include "mplayer/gmplayer.h" | |
25 #include "mplayer/widgets.h" | |
26 #include "skin/skin.h" | |
23077 | 27 #include "wm/ws.h" |
28 #include "wm/wsxdnd.h" | |
29 | |
30 #include "access_mpcontext.h" | |
32984 | 31 #include "config.h" |
23077 | 32 #include "help_mp.h" |
32984 | 33 #include "input/input.h" |
34 #include "libaf/equalizer.h" | |
35 #include "libao2/audio_out.h" | |
36 #include "libmpcodecs/dec_audio.h" | |
37 #include "libmpcodecs/dec_video.h" | |
38 #include "libmpcodecs/vd.h" | |
39 #include "libmpcodecs/vf.h" | |
40 #include "libvo/video_out.h" | |
41 #include "libvo/x11_common.h" | |
42 #include "mixer.h" | |
30516 | 43 #include "mp_core.h" |
32984 | 44 #include "mp_msg.h" |
32032 | 45 #include "mpcommon.h" |
30536
39a4dd7ec420
Move GUI-related extern declarations to a GUI header file.
diego
parents:
30535
diff
changeset
|
46 #include "mplayer.h" |
32984 | 47 #include "path.h" |
32466
9e627a1793b1
Move font_load.[ch], font_load_ft.c and osd_font.h from libvo to sub.
cigaes
parents:
32461
diff
changeset
|
48 #include "sub/font_load.h" |
32467 | 49 #include "sub/sub.h" |
23077 | 50 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
51 #ifdef CONFIG_DVDREAD |
23077 | 52 #include "stream/stream_dvd.h" |
53 #endif | |
54 | |
33263 | 55 #define DONE -1 |
56 | |
32984 | 57 guiInterface_t guiIntfStruct; |
23077 | 58 |
32984 | 59 int guiWinID = -1; |
23077 | 60 |
32900 | 61 char *skinName; |
62 char *skinDirInHome; | |
63 char *skinMPlayerDir; | |
64 | |
32984 | 65 plItem *plCurrent = NULL; |
66 plItem *plList = NULL; | |
67 plItem *plLastPlayed = NULL; | |
68 | |
69 URLItem *URLList = NULL; | |
70 | |
71 char *fsHistory[fsPersistant_MaxPos] = { NULL, NULL, NULL, NULL, NULL }; | |
72 | |
73 float gtkEquChannels[6][10]; | |
74 | |
75 int gstrcmp(const char *a, const char *b) | |
23077 | 76 { |
32984 | 77 if (!a && !b) |
78 return 0; | |
79 if (!a || !b) | |
80 return -1; | |
23077 | 81 |
32984 | 82 return strcmp(a, b); |
23077 | 83 } |
84 | |
32984 | 85 static int gstrncmp(const char *a, const char *b, int size) |
23077 | 86 { |
32984 | 87 if (!a && !b) |
88 return 0; | |
89 if (!a || !b) | |
90 return -1; | |
91 | |
92 return strncmp(a, b, size); | |
23077 | 93 } |
94 | |
32984 | 95 char *gstrdup(const char *str) |
23077 | 96 { |
32984 | 97 if (!str) |
98 return NULL; | |
99 | |
100 return strdup(str); | |
23077 | 101 } |
102 | |
32984 | 103 char *gstrchr(char *str, int c) |
23077 | 104 { |
32984 | 105 if (!str) |
106 return NULL; | |
107 | |
108 return strchr(str, c); | |
109 } | |
110 | |
111 void gfree(void **p) | |
112 { | |
113 free(*p); | |
114 *p = NULL; | |
23077 | 115 } |
116 | |
117 /** | |
32984 | 118 * \brief This actually creates a new list containing only one element... |
23077 | 119 */ |
32984 | 120 void gaddlist(char ***list, const char *entry) |
23077 | 121 { |
32984 | 122 int i; |
23077 | 123 |
32984 | 124 if (*list) { |
125 for (i = 0; (*list)[i]; i++) | |
126 free((*list)[i]); | |
23077 | 127 |
32984 | 128 free(*list); |
129 } | |
130 | |
131 *list = malloc(2 * sizeof(char **)); | |
132 (*list)[0] = gstrdup(entry); | |
133 (*list)[1] = NULL; | |
23077 | 134 } |
135 | |
136 /** | |
32984 | 137 * \brief This replaces a string starting with search by replace. |
23077 | 138 * If not found, replace is appended. |
139 */ | |
30535
016e5fc1dead
GUI: Mark functions that are not used outside their files as static.
diego
parents:
30516
diff
changeset
|
140 static void greplace(char ***list, const char *search, const char *replace) |
23077 | 141 { |
32984 | 142 int i = 0; |
143 int len = (search ? strlen(search) : 0); | |
23077 | 144 |
32984 | 145 if (*list) { |
146 for (i = 0; (*list)[i]; i++) { | |
147 if (search && (strncmp((*list)[i], search, len) == 0)) { | |
148 free((*list)[i]); | |
149 (*list)[i] = gstrdup(replace); | |
150 return; | |
151 } | |
152 } | |
23077 | 153 |
32984 | 154 *list = realloc(*list, (i + 2) * sizeof(char *)); |
155 } else | |
156 *list = malloc(2 * sizeof(char *)); | |
157 | |
158 (*list)[i] = gstrdup(replace); | |
159 (*list)[i + 1] = NULL; | |
23077 | 160 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
161 |
32984 | 162 void guiInit(void) |
23077 | 163 { |
32984 | 164 int i; |
23077 | 165 |
32984 | 166 memset(&guiIntfStruct, 0, sizeof(guiIntfStruct)); |
167 guiIntfStruct.Balance = 50.0f; | |
168 guiIntfStruct.StreamType = -1; | |
169 | |
170 appInitStruct(); | |
171 | |
172 memset(>kEquChannels, 0, sizeof(gtkEquChannels)); | |
23077 | 173 |
32984 | 174 #ifdef CONFIG_DXR3 |
175 if (!gtkDXR3Device) | |
176 gtkDXR3Device = strdup("/dev/em8300-0"); | |
177 #endif | |
32927 | 178 |
32984 | 179 if (stream_cache_size > 0) { |
180 gtkCacheOn = 1; | |
181 gtkCacheSize = stream_cache_size; | |
182 } else if (stream_cache_size == 0) | |
183 gtkCacheOn = 0; | |
184 | |
185 if (autosync && (autosync != gtkAutoSync)) { | |
186 gtkAutoSyncOn = 1; | |
187 gtkAutoSync = autosync; | |
188 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
189 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
190 #ifdef CONFIG_ASS |
32984 | 191 gtkASS.enabled = ass_enabled; |
192 gtkASS.use_margins = ass_use_margins; | |
193 gtkASS.top_margin = ass_top_margin; | |
194 gtkASS.bottom_margin = ass_bottom_margin; | |
23077 | 195 #endif |
196 | |
32984 | 197 gtkInit(); |
198 | |
199 // initialize X | |
200 wsXInit((void *)mDisplay); | |
201 | |
202 // load skin | |
203 | |
204 skinDirInHome = get_path("skins"); | |
205 skinMPlayerDir = MPLAYER_DATADIR "/skins"; | |
206 | |
207 mp_msg(MSGT_GPLAYER, MSGL_V, "SKIN dir 1: '%s'\n", skinDirInHome); | |
208 mp_msg(MSGT_GPLAYER, MSGL_V, "SKIN dir 2: '%s'\n", skinMPlayerDir); | |
209 | |
210 if (!skinName) | |
211 skinName = strdup("default"); | |
212 | |
213 i = skinRead(skinName); | |
214 | |
215 if (i == -1 && strcmp(skinName, "default") != 0) { | |
216 mp_msg(MSGT_GPLAYER, MSGL_WARN, MSGTR_SKIN_SKINCFG_SelectedSkinNotFound, skinName); | |
217 | |
218 skinName = strdup("default"); | |
219 i = skinRead(skinName); | |
220 } | |
221 | |
222 switch (i) { | |
223 case -1: | |
33024 | 224 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_SKIN_SKINCFG_SkinNotFound, skinName); |
33263 | 225 guiExit(EXIT_ERROR); |
23077 | 226 |
32984 | 227 case -2: |
33025 | 228 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_SKIN_SKINCFG_SkinCfgError, skinName); |
33263 | 229 guiExit(EXIT_ERROR); |
32984 | 230 } |
231 | |
232 // initialize windows | |
233 | |
234 mplDrawBuffer = malloc(appMPlayer.main.Bitmap.ImageSize); | |
235 | |
236 if (!mplDrawBuffer) { | |
33024 | 237 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_NEMDB); |
33263 | 238 guiExit(EXIT_ERROR); |
32984 | 239 } |
23077 | 240 |
32984 | 241 if (gui_save_pos) { |
33218
f0c2a62e3e89
Position windows initially at coordinates given in skin file.
ib
parents:
33053
diff
changeset
|
242 if (gui_main_pos_x != -3) |
33219 | 243 appMPlayer.main.x = gui_main_pos_x; |
33218
f0c2a62e3e89
Position windows initially at coordinates given in skin file.
ib
parents:
33053
diff
changeset
|
244 if (gui_main_pos_y != -3) |
33219 | 245 appMPlayer.main.y = gui_main_pos_y; |
33218
f0c2a62e3e89
Position windows initially at coordinates given in skin file.
ib
parents:
33053
diff
changeset
|
246 if (gui_sub_pos_x != -3) |
33219 | 247 appMPlayer.sub.x = gui_sub_pos_x; |
33218
f0c2a62e3e89
Position windows initially at coordinates given in skin file.
ib
parents:
33053
diff
changeset
|
248 if (gui_sub_pos_y != -3) |
33219 | 249 appMPlayer.sub.y = gui_sub_pos_y; |
32984 | 250 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
251 |
32984 | 252 if (WinID > 0) { |
253 appMPlayer.subWindow.Parent = WinID; | |
254 appMPlayer.sub.x = 0; | |
255 appMPlayer.sub.y = 0; | |
256 } | |
23077 | 257 |
32984 | 258 if (guiWinID >= 0) |
259 appMPlayer.mainWindow.Parent = guiWinID; | |
23077 | 260 |
32984 | 261 wsCreateWindow(&appMPlayer.subWindow, appMPlayer.sub.x, appMPlayer.sub.y, appMPlayer.sub.width, appMPlayer.sub.height, wsNoBorder, wsShowMouseCursor | wsHandleMouseButton | wsHandleMouseMove, wsShowFrame | wsHideWindow, "MPlayer - Video"); |
262 wsDestroyImage(&appMPlayer.subWindow); | |
263 wsCreateImage(&appMPlayer.subWindow, appMPlayer.sub.Bitmap.Width, appMPlayer.sub.Bitmap.Height); | |
264 wsXDNDMakeAwareness(&appMPlayer.subWindow); | |
265 | |
266 mplMenuInit(); | |
267 mplPBInit(); | |
23077 | 268 |
269 // i=wsHideFrame|wsMaxSize|wsHideWindow; | |
270 // if ( appMPlayer.mainDecoration ) i=wsShowFrame|wsMaxSize|wsHideWindow; | |
32984 | 271 i = wsShowFrame | wsMaxSize | wsHideWindow; |
272 wsCreateWindow(&appMPlayer.mainWindow, appMPlayer.main.x, appMPlayer.main.y, appMPlayer.main.width, appMPlayer.main.height, wsNoBorder, wsShowMouseCursor | wsHandleMouseButton | wsHandleMouseMove, i, "MPlayer"); | |
273 wsSetShape(&appMPlayer.mainWindow, appMPlayer.main.Mask.Image); | |
274 wsXDNDMakeAwareness(&appMPlayer.mainWindow); | |
23077 | 275 |
276 #ifdef DEBUG | |
32984 | 277 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[main] depth on screen: %d\n", wsDepthOnScreen); |
278 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[main] parent: 0x%x\n", (int)appMPlayer.mainWindow.WindowID); | |
279 mp_msg(MSGT_GPLAYER, MSGL_DBG2, "[main] sub: 0x%x\n", (int)appMPlayer.subWindow.WindowID); | |
23077 | 280 #endif |
281 | |
32984 | 282 appMPlayer.mainWindow.ReDraw = (void *)mplMainDraw; |
283 appMPlayer.mainWindow.MouseHandler = mplMainMouseHandle; | |
284 appMPlayer.mainWindow.KeyHandler = mplMainKeyHandle; | |
285 appMPlayer.mainWindow.DandDHandler = mplDandDHandler; | |
286 | |
287 appMPlayer.subWindow.ReDraw = (void *)mplSubDraw; | |
288 appMPlayer.subWindow.MouseHandler = mplSubMouseHandle; | |
289 appMPlayer.subWindow.KeyHandler = mplMainKeyHandle; | |
290 appMPlayer.subWindow.DandDHandler = mplDandDHandler; | |
23077 | 291 |
32984 | 292 wsSetBackgroundRGB(&appMPlayer.subWindow, appMPlayer.sub.R, appMPlayer.sub.G, appMPlayer.sub.B); |
293 wsClearWindow(appMPlayer.subWindow); | |
23077 | 294 |
32984 | 295 if (appMPlayer.sub.Bitmap.Image) |
296 wsConvert(&appMPlayer.subWindow, appMPlayer.sub.Bitmap.Image, appMPlayer.sub.Bitmap.ImageSize); | |
297 | |
298 btnModify(evSetVolume, guiIntfStruct.Volume); | |
299 btnModify(evSetBalance, guiIntfStruct.Balance); | |
300 btnModify(evSetMoviePosition, guiIntfStruct.Position); | |
23077 | 301 |
32984 | 302 wsSetIcon(wsDisplay, appMPlayer.mainWindow.WindowID, guiIcon, guiIconMask); |
303 wsSetIcon(wsDisplay, appMPlayer.subWindow.WindowID, guiIcon, guiIconMask); | |
304 | |
305 guiIntfStruct.Playing = 0; | |
23077 | 306 |
32984 | 307 if (!appMPlayer.mainDecoration) |
308 wsWindowDecoration(&appMPlayer.mainWindow, 0); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
309 |
32984 | 310 wsVisibleWindow(&appMPlayer.mainWindow, wsShowWindow); |
23077 | 311 |
312 #if 0 | |
32984 | 313 wsVisibleWindow(&appMPlayer.subWindow, wsShowWindow); |
314 { | |
315 XEvent xev; | |
23077 | 316 |
32984 | 317 do |
318 XNextEvent(wsDisplay, &xev); | |
319 while (xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID); | |
320 | |
321 appMPlayer.subWindow.Mapped = wsMapped; | |
322 } | |
323 | |
324 if (!fullscreen) | |
325 fullscreen = gtkLoadFullscreen; | |
23077 | 326 |
32984 | 327 if (fullscreen) { |
23077 | 328 mplFullScreen(); |
32984 | 329 btnModify(evFullScreen, btnPressed); |
330 } | |
331 #else | |
332 if (!fullscreen) | |
333 fullscreen = gtkLoadFullscreen; | |
334 | |
335 if (gtkShowVideoWindow) { | |
336 wsVisibleWindow(&appMPlayer.subWindow, wsShowWindow); | |
337 { | |
338 XEvent xev; | |
339 | |
340 do | |
341 XNextEvent(wsDisplay, &xev); | |
342 while (xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID); | |
343 | |
344 appMPlayer.subWindow.Mapped = wsMapped; | |
345 } | |
23077 | 346 |
32984 | 347 if (fullscreen) { |
348 mplFullScreen(); | |
349 btnModify(evFullScreen, btnPressed); | |
350 } | |
351 } else { | |
352 if (fullscreen) { | |
353 wsVisibleWindow(&appMPlayer.subWindow, wsShowWindow); | |
354 { | |
355 XEvent xev; | |
356 | |
357 do | |
358 XNextEvent(wsDisplay, &xev); | |
359 while (xev.type != MapNotify || xev.xmap.event != appMPlayer.subWindow.WindowID); | |
360 | |
361 appMPlayer.subWindow.Mapped = wsMapped; | |
362 } | |
363 wsVisibleWindow(&appMPlayer.subWindow, wsShowWindow); | |
364 mplFullScreen(); | |
365 btnModify(evFullScreen, btnPressed); | |
366 } | |
367 } | |
23077 | 368 #endif |
32984 | 369 |
370 mplSubRender = 1; | |
371 | |
372 if (filename) | |
373 mplSetFileName(NULL, filename, STREAMTYPE_FILE); | |
23077 | 374 |
32984 | 375 if (plCurrent && !filename) |
376 mplSetFileName(plCurrent->path, plCurrent->name, STREAMTYPE_FILE); | |
377 | |
378 if (subdata) | |
379 guiSetFilename(guiIntfStruct.Subtitlename, subdata->filename); | |
380 | |
381 guiLoadFont(); | |
23077 | 382 } |
383 | |
32984 | 384 void guiDone(void) |
23077 | 385 { |
32984 | 386 mplMainRender = 0; |
387 | |
388 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] done.\n"); | |
23077 | 389 |
32984 | 390 if (gui_save_pos) { |
391 gui_main_pos_x = appMPlayer.mainWindow.X; | |
392 gui_main_pos_y = appMPlayer.mainWindow.Y; | |
393 gui_sub_pos_x = appMPlayer.subWindow.X; | |
394 gui_sub_pos_y = appMPlayer.subWindow.Y; | |
395 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
396 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
397 #ifdef CONFIG_ASS |
32984 | 398 ass_enabled = gtkASS.enabled; |
399 ass_use_margins = gtkASS.use_margins; | |
400 ass_top_margin = gtkASS.top_margin; | |
401 ass_bottom_margin = gtkASS.bottom_margin; | |
23077 | 402 #endif |
403 | |
32984 | 404 cfg_write(); |
405 wsXDone(); | |
33263 | 406 |
407 guiExit(DONE); | |
408 } | |
409 | |
410 // NOTE TO MYSELF: Before calling guiInit(), MPlayer calls GUI functions | |
411 // cfg_read() and import_initial_playtree_into_gui(). Only | |
412 // after guiInit() has been called successfully, guiDone() | |
413 // (and thus guiExit()) will be executed by MPlayer on exit. | |
414 // In other words, any MPlayer's exit between cfg_read() and | |
415 // guiInit() will not execute guiDone(). | |
416 // With this function it is at least possible to handle | |
417 // GUI's own abortions during (and before) guiInit(). | |
418 void guiExit(int how) | |
419 { | |
420 if (how != DONE) | |
421 exit_player(how); | |
23077 | 422 } |
423 | |
32984 | 424 void guiLoadFont(void) |
23077 | 425 { |
27393 | 426 #ifdef CONFIG_FREETYPE |
32984 | 427 load_font_ft(vo_image_width, vo_image_height, &vo_font, font_name, osd_font_scale_factor); |
23077 | 428 #else |
32984 | 429 if (vo_font) { |
430 int i; | |
431 | |
432 free(vo_font->name); | |
433 free(vo_font->fpath); | |
434 | |
435 for (i = 0; i < 16; i++) { | |
436 if (vo_font->pic_a[i]) { | |
437 free(vo_font->pic_a[i]->bmp); | |
438 free(vo_font->pic_a[i]->pal); | |
439 } | |
440 } | |
441 | |
442 for (i = 0; i < 16; i++) { | |
443 if (vo_font->pic_b[i]) { | |
444 free(vo_font->pic_b[i]->bmp); | |
445 free(vo_font->pic_b[i]->pal); | |
446 } | |
447 } | |
448 | |
449 free(vo_font); | |
450 vo_font = NULL; | |
451 } | |
452 | |
453 if (font_name) { | |
454 vo_font = read_font_desc(font_name, font_factor, 0); | |
455 | |
456 if (!vo_font) | |
457 mp_msg(MSGT_CPLAYER, MSGL_ERR, MSGTR_CantLoadFont, font_name); | |
458 } else { | |
459 font_name = gstrdup(get_path("font/font.desc")); | |
460 vo_font = read_font_desc(font_name, font_factor, 0); | |
461 | |
462 if (!vo_font) { | |
463 gfree((void **)&font_name); | |
464 font_name = gstrdup(MPLAYER_DATADIR "/font/font.desc"); | |
465 vo_font = read_font_desc(font_name, font_factor, 0); | |
466 } | |
467 } | |
23077 | 468 #endif |
469 } | |
470 | |
32984 | 471 void guiLoadSubtitle(char *name) |
23077 | 472 { |
32984 | 473 if (guiIntfStruct.Playing == 0) { |
474 guiIntfStruct.SubtitleChanged = 1; // what is this for? (mw) | |
475 return; | |
23077 | 476 } |
32984 | 477 |
478 if (subdata) { | |
479 mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_DeletingSubtitles); | |
480 | |
481 sub_free(subdata); | |
482 subdata = NULL; | |
483 vo_sub = NULL; | |
484 | |
485 if (vo_osd_list) { | |
486 int len; | |
487 mp_osd_obj_t *osd; | |
488 | |
489 osd = vo_osd_list; | |
490 | |
491 while (osd) { | |
492 if (osd->type == OSDTYPE_SUBTITLE) | |
493 break; | |
494 | |
495 osd = osd->next; | |
496 } | |
23077 | 497 |
32984 | 498 if (osd && (osd->flags & OSDFLAG_VISIBLE)) { |
499 len = osd->stride * (osd->bbox.y2 - osd->bbox.y1); | |
500 memset(osd->bitmap_buffer, 0, len); | |
501 memset(osd->alpha_buffer, 0, len); | |
502 } | |
503 } | |
504 } | |
505 | |
506 if (name) { | |
507 mp_msg(MSGT_GPLAYER, MSGL_INFO, MSGTR_LoadingSubtitles, name); | |
508 | |
509 subdata = sub_read_file(name, guiIntfStruct.FPS); | |
510 | |
511 if (!subdata) | |
512 mp_msg(MSGT_GPLAYER, MSGL_ERR, MSGTR_CantLoadSub, name); | |
513 | |
514 sub_name = (malloc(2 * sizeof(char *))); // when mplayer will be restarted | |
515 sub_name[0] = strdup(name); // sub_name[0] will be read | |
516 sub_name[1] = NULL; | |
517 } | |
518 | |
519 update_set_of_subtitles(); | |
23077 | 520 } |
521 | |
32984 | 522 static void add_vf(char *str) |
23077 | 523 { |
32984 | 524 void *p; |
525 | |
526 if (vf_settings) { | |
527 int i = 0; | |
528 | |
529 while (vf_settings[i].name) { | |
530 if (!gstrcmp(vf_settings[i++].name, str)) { | |
531 i = -1; | |
532 break; | |
533 } | |
534 } | |
535 | |
536 if (i != -1) { | |
537 p = realloc(vf_settings, (i + 2) * sizeof(m_obj_settings_t)); | |
32712 | 538 |
32984 | 539 if (!p) |
540 return; | |
541 | |
542 vf_settings = p; | |
543 vf_settings[i].name = strdup(str); | |
544 vf_settings[i].attribs = NULL; | |
545 vf_settings[i + 1].name = NULL; | |
546 } | |
547 } else { | |
548 vf_settings = malloc(2 * sizeof(m_obj_settings_t)); | |
549 vf_settings[0].name = strdup(str); | |
550 vf_settings[0].attribs = NULL; | |
551 vf_settings[1].name = NULL; | |
32712 | 552 } |
553 | |
32984 | 554 mp_msg(MSGT_GPLAYER, MSGL_STATUS, MSGTR_AddingVideoFilter, str); |
23077 | 555 } |
556 | |
32984 | 557 int guiGetEvent(int type, void *arg) |
23077 | 558 { |
32984 | 559 const ao_functions_t *audio_out = NULL; |
560 const vo_functions_t *video_out = NULL; | |
561 mixer_t *mixer = NULL; | |
23077 | 562 |
32984 | 563 stream_t *stream = arg; |
564 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
565 #ifdef CONFIG_DVDREAD |
32984 | 566 dvd_priv_t *dvdp = arg; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
567 #endif |
23077 | 568 |
32984 | 569 if (guiIntfStruct.mpcontext) { |
570 audio_out = mpctx_get_audio_out(guiIntfStruct.mpcontext); | |
571 video_out = mpctx_get_video_out(guiIntfStruct.mpcontext); | |
572 mixer = mpctx_get_mixer(guiIntfStruct.mpcontext); | |
573 } | |
23077 | 574 |
32984 | 575 switch (type) { |
576 case guiXEvent: | |
577 guiIntfStruct.event_struct = arg; | |
578 wsEvents(wsDisplay, arg, NULL); | |
23077 | 579 gtkEventHandling(); |
580 break; | |
32984 | 581 |
582 case guiCEvent: | |
583 | |
584 switch ((int)arg) { | |
585 case guiSetPlay: | |
586 guiIntfStruct.Playing = 1; | |
587 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
588 break; | |
589 | |
590 case guiSetStop: | |
591 guiIntfStruct.Playing = 0; | |
592 // if ( !gtkShowVideoWindow ) wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
593 break; | |
594 | |
595 case guiSetPause: | |
596 guiIntfStruct.Playing = 2; | |
597 break; | |
598 } | |
599 | |
600 mplState(); | |
23077 | 601 break; |
32984 | 602 |
603 case guiSetState: | |
604 mplState(); | |
605 break; | |
606 | |
607 case guiSetFileName: | |
608 if (arg) | |
609 guiSetFilename(guiIntfStruct.Filename, arg); | |
23077 | 610 break; |
32984 | 611 |
612 case guiSetAudioOnly: | |
613 | |
614 guiIntfStruct.AudioOnly = (int)arg; | |
615 | |
616 if ((int)arg) { | |
617 guiIntfStruct.NoWindow = True; | |
618 wsVisibleWindow(&appMPlayer.subWindow, wsHideWindow); | |
619 } else | |
620 wsVisibleWindow(&appMPlayer.subWindow, wsShowWindow); | |
621 | |
23077 | 622 break; |
32984 | 623 |
624 case guiSetContext: | |
625 guiIntfStruct.mpcontext = arg; | |
626 // NOTE TO MYSELF: is break missing? | |
627 | |
628 case guiSetDemuxer: | |
629 guiIntfStruct.demuxer = arg; | |
630 break; | |
631 | |
632 case guiSetAfilter: | |
633 guiIntfStruct.afilter = arg; | |
634 break; | |
635 | |
636 case guiSetShVideo: | |
637 | |
638 if (!appMPlayer.subWindow.isFullScreen) { | |
639 wsResizeWindow(&appMPlayer.subWindow, vo_dwidth, vo_dheight); | |
640 wsMoveWindow(&appMPlayer.subWindow, True, appMPlayer.sub.x, appMPlayer.sub.y); | |
641 } | |
642 | |
643 guiIntfStruct.MovieWidth = vo_dwidth; | |
644 guiIntfStruct.MovieHeight = vo_dheight; | |
645 | |
646 if (guiWinID >= 0) | |
647 wsMoveWindow(&appMPlayer.mainWindow, 0, 0, vo_dheight); | |
648 | |
649 WinID = appMPlayer.subWindow.WindowID; | |
650 break; | |
651 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
652 #ifdef CONFIG_DVDREAD |
32984 | 653 case guiSetDVD: |
654 guiIntfStruct.DVD.titles = dvdp->vmg_file->tt_srpt->nr_of_srpts; | |
655 guiIntfStruct.DVD.chapters = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
656 guiIntfStruct.DVD.angles = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
657 guiIntfStruct.DVD.nr_of_audio_channels = dvdp->nr_of_channels; | |
658 memcpy(guiIntfStruct.DVD.audio_streams, dvdp->audio_streams, sizeof(dvdp->audio_streams)); | |
659 guiIntfStruct.DVD.nr_of_subtitles = dvdp->nr_of_subtitles; | |
660 memcpy(guiIntfStruct.DVD.subtitles, dvdp->subtitles, sizeof(dvdp->subtitles)); | |
661 guiIntfStruct.DVD.current_title = dvd_title + 1; | |
662 guiIntfStruct.DVD.current_chapter = dvd_chapter + 1; | |
663 guiIntfStruct.DVD.current_angle = dvd_angle + 1; | |
664 guiIntfStruct.Track = dvd_title + 1; | |
23077 | 665 break; |
666 #endif | |
32984 | 667 |
668 case guiSetStream: | |
669 | |
670 guiIntfStruct.StreamType = stream->type; | |
671 | |
672 switch (stream->type) { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
673 #ifdef CONFIG_DVDREAD |
32984 | 674 case STREAMTYPE_DVD: |
675 guiGetEvent(guiSetDVD, (char *)stream->priv); | |
676 break; | |
23077 | 677 #endif |
32984 | 678 |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
679 #ifdef CONFIG_VCD |
32984 | 680 case STREAMTYPE_VCD: |
33006 | 681 guiIntfStruct.VCDTracks = 0; |
682 stream_control(stream, STREAM_CTRL_GET_NUM_CHAPTERS, &guiIntfStruct.VCDTracks); | |
32984 | 683 break; |
23077 | 684 #endif |
32984 | 685 |
686 default: | |
687 break; | |
688 } | |
689 | |
690 break; | |
691 | |
692 case guiIEvent: | |
693 | |
694 mp_msg(MSGT_GPLAYER, MSGL_V, "cmd: %d\n", (int)arg); | |
695 | |
696 switch ((int)arg) { | |
697 case MP_CMD_QUIT: | |
698 mplEventHandling(evExit, 0); | |
699 break; | |
23077 | 700 |
32984 | 701 case MP_CMD_VO_FULLSCREEN: |
702 mplEventHandling(evFullScreen, 0); | |
703 break; | |
704 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
705 |
32984 | 706 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
707 |
32984 | 708 case guiReDraw: |
709 mplEventHandling(evRedraw, 0); | |
710 break; | |
711 | |
712 case guiSetVolume: | |
713 if (audio_out) { | |
714 float l, r; | |
715 | |
716 mixer_getvolume(mixer, &l, &r); | |
717 guiIntfStruct.Volume = (r > l ? r : l); | |
23077 | 718 |
32984 | 719 if (r != l) |
720 guiIntfStruct.Balance = ((r - l) + 100) * 0.5f; | |
721 else | |
722 guiIntfStruct.Balance = 50.0f; | |
723 | |
724 btnModify(evSetVolume, guiIntfStruct.Volume); | |
725 btnModify(evSetBalance, guiIntfStruct.Balance); | |
726 } | |
727 break; | |
728 | |
729 case guiSetFileFormat: | |
730 guiIntfStruct.FileFormat = (int)arg; | |
731 break; | |
732 | |
733 case guiSetValues: | |
734 | |
735 // video | |
736 | |
737 guiIntfStruct.sh_video = arg; | |
738 | |
739 if (arg) { | |
740 sh_video_t *sh = arg; | |
741 guiIntfStruct.FPS = sh->fps; | |
742 } | |
743 | |
744 if (guiIntfStruct.NoWindow) | |
745 wsVisibleWindow(&appMPlayer.subWindow, wsHideWindow); | |
746 | |
747 if (guiIntfStruct.StreamType == STREAMTYPE_STREAM) | |
748 btnSet(evSetMoviePosition, btnDisabled); | |
749 else | |
750 btnSet(evSetMoviePosition, btnReleased); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
751 |
32984 | 752 // audio |
753 | |
754 if (audio_out) { | |
755 float l, r; | |
756 | |
757 mixer_getvolume(mixer, &l, &r); | |
758 guiIntfStruct.Volume = (r > l ? r : l); | |
759 | |
760 if (r != l) | |
761 guiIntfStruct.Balance = ((r - l) + 100) * 0.5f; | |
762 else | |
763 guiIntfStruct.Balance = 50.0f; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
764 |
32984 | 765 btnModify(evSetVolume, guiIntfStruct.Volume); |
766 btnModify(evSetBalance, guiIntfStruct.Balance); | |
767 } | |
768 | |
769 if (gtkEnableAudioEqualizer) { | |
770 equalizer_t eq; | |
771 int i, j; | |
23077 | 772 |
32984 | 773 for (i = 0; i < 6; i++) { |
774 for (j = 0; j < 10; j++) { | |
775 eq.channel = i; | |
776 eq.band = j; | |
777 eq.gain = gtkEquChannels[i][j]; | |
778 gtkSet(gtkSetEqualizer, 0, &eq); | |
779 } | |
780 } | |
781 } | |
782 | |
783 // subtitle | |
23077 | 784 |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
785 #ifdef CONFIG_DXR3 |
32984 | 786 if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3") && (guiIntfStruct.FileFormat != DEMUXER_TYPE_MPEG_PS) && !gtkVfLAVC) { |
787 gtkMessageBox(GTK_MB_FATAL, MSGTR_NEEDLAVC); | |
788 guiIntfStruct.Playing = 0; | |
789 return True; | |
790 } | |
23077 | 791 #endif |
32984 | 792 |
793 break; | |
794 | |
795 case guiSetDefaults: | |
796 | |
797 // if ( guiIntfStruct.Playing == 1 && guiIntfStruct.FilenameChanged ) | |
798 if (guiIntfStruct.FilenameChanged) { | |
799 audio_id = -1; | |
800 video_id = -1; | |
801 dvdsub_id = -1; | |
802 vobsub_id = -1; | |
803 stream_cache_size = -1; | |
804 autosync = 0; | |
805 dvd_title = 0; | |
806 force_fps = 0; | |
807 } | |
808 | |
809 guiIntfStruct.demuxer = NULL; | |
810 guiIntfStruct.sh_video = NULL; | |
811 wsPostRedisplay(&appMPlayer.subWindow); | |
812 | |
813 break; | |
814 | |
815 case guiSetParameters: | |
816 | |
817 guiGetEvent(guiSetDefaults, NULL); | |
818 | |
819 switch (guiIntfStruct.StreamType) { | |
820 case STREAMTYPE_PLAYLIST: | |
821 break; | |
822 | |
823 #ifdef CONFIG_VCD | |
824 case STREAMTYPE_VCD: | |
825 { | |
826 char tmp[512]; | |
827 | |
828 sprintf(tmp, "vcd://%d", guiIntfStruct.Track + 1); | |
829 guiSetFilename(guiIntfStruct.Filename, tmp); | |
830 } | |
831 break; | |
832 #endif | |
833 | |
834 #ifdef CONFIG_DVDREAD | |
835 case STREAMTYPE_DVD: | |
836 { | |
837 char tmp[512]; | |
838 | |
839 sprintf(tmp, "dvd://%d", guiIntfStruct.Title); | |
840 guiSetFilename(guiIntfStruct.Filename, tmp); | |
841 } | |
842 | |
843 dvd_chapter = guiIntfStruct.Chapter; | |
844 dvd_angle = guiIntfStruct.Angle; | |
845 | |
846 break; | |
847 #endif | |
848 } | |
849 | |
850 // if ( guiIntfStruct.StreamType != STREAMTYPE_PLAYLIST ) // Does not make problems anymore! | |
851 { | |
852 if (guiIntfStruct.Filename) | |
853 filename = gstrdup(guiIntfStruct.Filename); | |
854 else if (filename) | |
855 guiSetFilename(guiIntfStruct.Filename, filename); | |
856 } | |
857 | |
858 // video opts | |
859 | |
860 if (!video_driver_list) { | |
861 int i = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
862 |
32984 | 863 while (video_out_drivers[i++]) { |
864 if (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE) { | |
865 gaddlist(&video_driver_list, (char *)video_out_drivers[i - 1]->info->short_name); | |
866 break; | |
867 } | |
868 } | |
869 } | |
870 | |
871 if (!video_driver_list && !video_driver_list[0]) { | |
33024 | 872 gmp_msg(MSGT_GPLAYER, MSGL_FATAL, MSGTR_IDFGCVD); |
33263 | 873 guiExit(EXIT_ERROR); |
32984 | 874 } |
875 | |
876 { | |
877 int i = 0; | |
878 | |
879 guiIntfStruct.NoWindow = False; | |
880 | |
881 while (video_out_drivers[i++]) { | |
882 if (video_out_drivers[i - 1]->control(VOCTRL_GUISUPPORT, NULL) == VO_TRUE) { | |
883 if ((video_driver_list && !gstrcmp(video_driver_list[0], (char *)video_out_drivers[i - 1]->info->short_name)) && (video_out_drivers[i - 1]->control(VOCTRL_GUI_NOWINDOW, NULL) == VO_TRUE)) { | |
884 guiIntfStruct.NoWindow = True; | |
885 break; | |
886 } | |
887 } | |
888 } | |
889 } | |
890 | |
891 #ifdef CONFIG_DXR3 | |
892 if (video_driver_list && !gstrcmp(video_driver_list[0], "dxr3")) | |
893 if (guiIntfStruct.StreamType != STREAMTYPE_DVD && guiIntfStruct.StreamType != STREAMTYPE_VCD) | |
894 if (gtkVfLAVC) | |
895 add_vf("lavc"); | |
896 #endif | |
897 | |
898 if (gtkVfPP) | |
899 add_vf("pp"); | |
900 | |
901 // audio opts | |
902 | |
903 // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } | |
904 if (gtkAONorm) | |
905 greplace(&af_cfg.list, "volnorm", "volnorm"); | |
906 | |
907 if (gtkEnableAudioEqualizer) | |
908 greplace(&af_cfg.list, "equalizer", "equalizer"); | |
909 | |
910 if (gtkAOExtraStereo) { | |
911 char *name; | |
912 | |
913 name = malloc(12 + 20 + 1); | |
914 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
915 name[12 + 20] = 0; | |
916 greplace(&af_cfg.list, "extrastereo", name); | |
917 free(name); | |
918 } | |
919 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
920 #ifdef CONFIG_OSS_AUDIO |
32984 | 921 if (audio_driver_list && !gstrncmp(audio_driver_list[0], "oss", 3)) { |
922 char *tmp; | |
923 | |
924 mixer_device = gtkAOOSSMixer; | |
925 mixer_channel = gtkAOOSSMixerChannel; | |
926 | |
927 if (gtkAOOSSDevice) { | |
928 tmp = calloc(1, strlen(gtkAOOSSDevice) + 7); | |
929 sprintf(tmp, "oss:%s", gtkAOOSSDevice); | |
930 } else | |
931 tmp = strdup("oss"); | |
932 | |
933 gaddlist(&audio_driver_list, tmp); | |
934 free(tmp); | |
935 } | |
23077 | 936 #endif |
32984 | 937 |
27390
9d95dc936e66
Introduce CONFIG_ALSA preprocessor directive for ALSA 0.9 and 1.x.
diego
parents:
27387
diff
changeset
|
938 #ifdef CONFIG_ALSA |
32984 | 939 if (audio_driver_list && !gstrncmp(audio_driver_list[0], "alsa", 4)) { |
940 char *tmp; | |
941 | |
942 mixer_device = gtkAOALSAMixer; | |
943 mixer_channel = gtkAOALSAMixerChannel; | |
944 | |
945 if (gtkAOALSADevice) { | |
946 tmp = calloc(1, strlen(gtkAOALSADevice) + 14); | |
947 sprintf(tmp, "alsa:device=%s", gtkAOALSADevice); | |
948 } else | |
949 tmp = strdup("alsa"); | |
950 | |
951 gaddlist(&audio_driver_list, tmp); | |
952 free(tmp); | |
953 } | |
23077 | 954 #endif |
32984 | 955 |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
956 #ifdef CONFIG_SDL |
32984 | 957 if (audio_driver_list && !gstrncmp(audio_driver_list[0], "sdl", 3)) { |
958 char *tmp; | |
959 | |
960 if (gtkAOSDLDriver) { | |
961 tmp = calloc(1, strlen(gtkAOSDLDriver) + 10); | |
962 sprintf(tmp, "sdl:%s", gtkAOSDLDriver); | |
963 } else | |
964 tmp = strdup("sdl"); | |
965 | |
966 gaddlist(&audio_driver_list, tmp); | |
967 free(tmp); | |
968 } | |
23077 | 969 #endif |
32984 | 970 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
971 #ifdef CONFIG_ESD |
32984 | 972 if (audio_driver_list && !gstrncmp(audio_driver_list[0], "esd", 3)) { |
973 char *tmp; | |
974 | |
975 if (gtkAOESDDevice) { | |
976 tmp = calloc(1, strlen(gtkAOESDDevice) + 10); | |
977 sprintf(tmp, "esd:%s", gtkAOESDDevice); | |
978 } else | |
979 tmp = strdup("esd"); | |
980 | |
981 gaddlist(&audio_driver_list, tmp); | |
982 free(tmp); | |
983 } | |
23077 | 984 #endif |
32984 | 985 |
986 // subtitle | |
987 | |
988 // subdata->filename=gstrdup( guiIntfStruct.Subtitlename ); | |
989 stream_dump_type = 0; | |
990 | |
991 if (gtkSubDumpMPSub) | |
992 stream_dump_type = 4; | |
993 | |
994 if (gtkSubDumpSrt) | |
995 stream_dump_type = 6; | |
996 | |
997 gtkSubDumpMPSub = gtkSubDumpSrt = 0; | |
23077 | 998 guiLoadFont(); |
999 | |
32984 | 1000 // misc |
1001 | |
1002 if (gtkCacheOn) | |
1003 stream_cache_size = gtkCacheSize; | |
1004 | |
1005 if (gtkAutoSyncOn) | |
1006 autosync = gtkAutoSync; | |
23077 | 1007 |
32984 | 1008 if (guiIntfStruct.AudioFile) |
1009 audio_stream = gstrdup(guiIntfStruct.AudioFile); | |
1010 else if (guiIntfStruct.FilenameChanged) | |
1011 gfree((void **)&audio_stream); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1012 |
32984 | 1013 // audio_stream = NULL; |
1014 | |
1015 guiIntfStruct.DiskChanged = 0; | |
1016 guiIntfStruct.FilenameChanged = 0; | |
1017 guiIntfStruct.NewPlay = 0; | |
23077 | 1018 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
1019 #ifdef CONFIG_ASS |
32984 | 1020 ass_enabled = gtkASS.enabled; |
1021 ass_use_margins = gtkASS.use_margins; | |
1022 ass_top_margin = gtkASS.top_margin; | |
23077 | 1023 ass_bottom_margin = gtkASS.bottom_margin; |
1024 #endif | |
1025 | |
32984 | 1026 break; |
1027 } | |
1028 | |
1029 return False; | |
23077 | 1030 } |
1031 | |
32984 | 1032 void guiEventHandling(void) |
23077 | 1033 { |
32984 | 1034 if (!guiIntfStruct.Playing || guiIntfStruct.NoWindow) |
1035 wsHandleEvents(); | |
1036 | |
1037 gtkEventHandling(); | |
23077 | 1038 } |
1039 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1040 // --- |
32984 | 1041 #if defined(MP_DEBUG) && 0 |
1042 void list(void) | |
1043 { | |
1044 plItem *next = plList; | |
23077 | 1045 |
32984 | 1046 printf("--- list ---\n"); |
23077 | 1047 |
32984 | 1048 while (next || next->next) { |
1049 printf("item: %s/%s\n", next->path, next->name); | |
1050 | |
1051 if (next->next) | |
1052 next = next->next; | |
1053 else | |
1054 break; | |
1055 } | |
1056 | |
1057 printf("--- end of list ---\n"); | |
23077 | 1058 } |
1059 #else | |
1060 #define list(); | |
1061 #endif | |
1062 | |
32984 | 1063 void *gtkSet(int cmd, float fparam, void *vparam) |
23077 | 1064 { |
32984 | 1065 equalizer_t *eq = (equalizer_t *)vparam; |
1066 plItem *item = (plItem *)vparam; | |
1067 URLItem *url_item = (URLItem *)vparam; | |
1068 int is_added = True; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1069 |
32984 | 1070 switch (cmd) { |
1071 // handle playlist | |
1072 | |
1073 // add item to playlist | |
1074 case gtkAddPlItem: | |
23077 | 1075 |
32984 | 1076 if (plList) { |
1077 plItem *next = plList; | |
1078 | |
1079 while (next->next) | |
1080 // { | |
1081 // printf( "%s\n",next->name ); | |
1082 next = next->next; | |
1083 // } | |
1084 | |
1085 next->next = item; | |
1086 item->prev = next; | |
1087 } else { | |
1088 item->prev = item->next = NULL; | |
1089 plCurrent = plList = item; | |
1090 } | |
1091 | |
23077 | 1092 list(); |
33053 | 1093 |
23077 | 1094 return NULL; |
32984 | 1095 |
1096 // add item into playlist after current | |
1097 case gtkInsertPlItem: | |
1098 if (plCurrent) { | |
1099 plItem *curr = plCurrent; | |
1100 item->next = curr->next; | |
1101 | |
1102 if (item->next) | |
1103 item->next->prev = item; | |
1104 | |
1105 item->prev = curr; | |
1106 curr->next = item; | |
1107 plCurrent = plCurrent->next; | |
1108 | |
1109 return plCurrent; | |
1110 } else | |
1111 return gtkSet(gtkAddPlItem, 0, (void *)item); | |
1112 return NULL; // NOTE TO MYSELF: remove this | |
1113 | |
1114 // get current item from playlist | |
1115 case gtkGetNextPlItem: | |
1116 if (plCurrent && plCurrent->next) { | |
1117 plCurrent = plCurrent->next; | |
1118 // if (!plCurrent && plList) | |
1119 // { | |
1120 // plItem *next = plList; | |
1121 // | |
1122 // while (next->next) | |
1123 // { | |
1124 // if (!next->next) break; | |
1125 // next = next->next; | |
1126 // } | |
1127 // | |
1128 // plCurrent = next; | |
1129 // } | |
1130 return plCurrent; | |
1131 } | |
33053 | 1132 |
23077 | 1133 return NULL; |
32984 | 1134 |
1135 case gtkGetPrevPlItem: | |
1136 if (plCurrent && plCurrent->prev) { | |
1137 plCurrent = plCurrent->prev; | |
1138 // if ( !plCurrent && plList ) plCurrent=plList; | |
1139 return plCurrent; | |
1140 } | |
33053 | 1141 |
23077 | 1142 return NULL; |
32984 | 1143 |
1144 // set current item | |
1145 case gtkSetCurrPlItem: | |
1146 plCurrent = item; | |
1147 return plCurrent; | |
1148 | |
1149 // get current item | |
1150 case gtkGetCurrPlItem: | |
23077 | 1151 return plCurrent; |
32984 | 1152 |
1153 // delete current item | |
1154 case gtkDelCurrPlItem: | |
1155 { | |
1156 plItem *curr = plCurrent; | |
1157 | |
1158 if (!curr) | |
1159 return NULL; | |
23077 | 1160 |
32984 | 1161 if (curr->prev) |
1162 curr->prev->next = curr->next; | |
1163 if (curr->next) | |
1164 curr->next->prev = curr->prev; | |
1165 if (curr == plList) | |
1166 plList = curr->next; | |
1167 | |
1168 plCurrent = curr->next; | |
1169 | |
1170 // free it | |
1171 free(curr->path); | |
1172 free(curr->name); | |
1173 free(curr); | |
1174 } | |
1175 | |
1176 mplCurr(); // instead of using mplNext && mplPrev | |
33053 | 1177 |
32984 | 1178 return plCurrent; |
1179 | |
1180 // delete list | |
1181 case gtkDelPl: | |
1182 { | |
1183 plItem *curr = plList; | |
1184 plItem *next; | |
1185 | |
1186 if (!plList) | |
1187 return NULL; | |
23077 | 1188 |
32984 | 1189 if (!curr->next) { |
1190 free(curr->path); | |
1191 free(curr->name); | |
1192 free(curr); | |
1193 } else { | |
1194 while (curr->next) { | |
1195 next = curr->next; | |
1196 free(curr->path); | |
1197 free(curr->name); | |
1198 free(curr); | |
1199 curr = next; | |
1200 } | |
1201 } | |
1202 | |
1203 plList = NULL; | |
1204 plCurrent = NULL; | |
1205 } | |
33053 | 1206 |
23077 | 1207 return NULL; |
32984 | 1208 |
1209 // handle url | |
1210 case gtkAddURLItem: | |
1211 if (URLList) { | |
1212 URLItem *next_url = URLList; | |
1213 is_added = False; | |
1214 | |
1215 while (next_url->next) { | |
1216 if (!gstrcmp(next_url->url, url_item->url)) { | |
1217 is_added = True; | |
1218 break; | |
1219 } | |
1220 | |
1221 next_url = next_url->next; | |
1222 } | |
1223 | |
1224 if (!is_added && gstrcmp(next_url->url, url_item->url)) | |
1225 next_url->next = url_item; | |
1226 } else { | |
1227 url_item->next = NULL; | |
1228 URLList = url_item; | |
1229 } | |
33053 | 1230 |
23077 | 1231 return NULL; |
32984 | 1232 |
1233 // subtitle | |
1234 | |
27393 | 1235 #ifndef CONFIG_FREETYPE |
32984 | 1236 case gtkSetFontFactor: |
1237 font_factor = fparam; | |
1238 guiLoadFont(); | |
1239 return NULL; | |
23077 | 1240 #else |
32984 | 1241 case gtkSetFontOutLine: |
1242 subtitle_font_thickness = (8.0f / 100.0f) * fparam; | |
1243 guiLoadFont(); | |
1244 return NULL; | |
1245 | |
1246 case gtkSetFontBlur: | |
1247 subtitle_font_radius = (8.0f / 100.0f) * fparam; | |
1248 guiLoadFont(); | |
1249 return NULL; | |
1250 | |
1251 case gtkSetFontTextScale: | |
1252 text_font_scale_factor = fparam; | |
1253 guiLoadFont(); | |
1254 return NULL; | |
1255 | |
1256 case gtkSetFontOSDScale: | |
1257 osd_font_scale_factor = fparam; | |
1258 guiLoadFont(); | |
1259 return NULL; | |
1260 | |
1261 case gtkSetFontEncoding: | |
1262 gfree((void **)&subtitle_font_encoding); | |
1263 subtitle_font_encoding = gstrdup((char *)vparam); | |
1264 guiLoadFont(); | |
1265 return NULL; | |
1266 | |
1267 case gtkSetFontAutoScale: | |
1268 subtitle_autoscale = (int)fparam; | |
1269 guiLoadFont(); | |
1270 return NULL; | |
23077 | 1271 #endif |
32984 | 1272 |
27393 | 1273 #ifdef CONFIG_ICONV |
32984 | 1274 case gtkSetSubEncoding: |
1275 gfree((void **)&sub_cp); | |
1276 sub_cp = gstrdup((char *)vparam); | |
1277 break; | |
23077 | 1278 #endif |
32984 | 1279 |
1280 // misc | |
1281 | |
1282 case gtkClearStruct: | |
1283 | |
1284 if ((unsigned int)vparam & guiFilenames) { | |
1285 gfree((void **)&guiIntfStruct.Filename); | |
1286 gfree((void **)&guiIntfStruct.Subtitlename); | |
1287 gfree((void **)&guiIntfStruct.AudioFile); | |
1288 gtkSet(gtkDelPl, 0, NULL); | |
1289 } | |
1290 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
1291 #ifdef CONFIG_DVDREAD |
32984 | 1292 if ((unsigned int)vparam & guiDVD) |
1293 memset(&guiIntfStruct.DVD, 0, sizeof(guiDVDStruct)); | |
23077 | 1294 #endif |
32984 | 1295 |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27359
diff
changeset
|
1296 #ifdef CONFIG_VCD |
32984 | 1297 if ((unsigned int)vparam & guiVCD) |
1298 guiIntfStruct.VCDTracks = 0; | |
23077 | 1299 #endif |
32984 | 1300 |
1301 return NULL; | |
1302 | |
1303 case gtkSetExtraStereo: | |
1304 gtkAOExtraStereoMul = fparam; | |
23077 | 1305 if (guiIntfStruct.afilter) |
32984 | 1306 af_control_any_rev(guiIntfStruct.afilter, AF_CONTROL_ES_MUL | AF_CONTROL_SET, >kAOExtraStereoMul); |
1307 return NULL; | |
1308 | |
1309 case gtkSetPanscan: | |
1310 { | |
1311 mp_cmd_t *mp_cmd; | |
1312 | |
1313 mp_cmd = calloc(1, sizeof(*mp_cmd)); | |
1314 mp_cmd->id = MP_CMD_PANSCAN; | |
1315 mp_cmd->name = strdup("panscan"); | |
1316 mp_cmd->args[0].v.f = fparam; | |
1317 mp_cmd->args[1].v.i = 1; | |
1318 mp_input_queue_cmd(mp_cmd); | |
1319 } | |
33053 | 1320 |
23077 | 1321 return NULL; |
32984 | 1322 |
1323 case gtkSetAutoq: | |
1324 auto_quality = (int)fparam; | |
1325 return NULL; | |
1326 | |
1327 // set equalizers | |
1328 | |
1329 case gtkSetContrast: | |
1330 if (guiIntfStruct.sh_video) | |
1331 set_video_colors(guiIntfStruct.sh_video, "contrast", (int)fparam); | |
1332 return NULL; | |
1333 | |
1334 case gtkSetBrightness: | |
1335 if (guiIntfStruct.sh_video) | |
1336 set_video_colors(guiIntfStruct.sh_video, "brightness", (int)fparam); | |
1337 return NULL; | |
1338 | |
1339 case gtkSetHue: | |
1340 if (guiIntfStruct.sh_video) | |
1341 set_video_colors(guiIntfStruct.sh_video, "hue", (int)fparam); | |
23077 | 1342 return NULL; |
32984 | 1343 |
1344 case gtkSetSaturation: | |
1345 if (guiIntfStruct.sh_video) | |
1346 set_video_colors(guiIntfStruct.sh_video, "saturation", (int)fparam); | |
1347 return NULL; | |
1348 | |
1349 case gtkSetEqualizer: | |
1350 { | |
23077 | 1351 af_control_ext_t tmp; |
32984 | 1352 |
1353 if (eq) { | |
1354 gtkEquChannels[eq->channel][eq->band] = eq->gain; | |
1355 tmp.ch = eq->channel; | |
1356 tmp.arg = gtkEquChannels[eq->channel]; | |
1357 | |
1358 if (guiIntfStruct.afilter) | |
1359 af_control_any_rev(guiIntfStruct.afilter, AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); | |
1360 } else { | |
1361 int i; | |
1362 | |
1363 memset(gtkEquChannels, 0, sizeof(gtkEquChannels)); | |
1364 | |
1365 if (guiIntfStruct.afilter) { | |
1366 for (i = 0; i < 6; i++) { | |
1367 tmp.ch = i; | |
1368 tmp.arg = gtkEquChannels[i]; | |
1369 af_control_any_rev(guiIntfStruct.afilter, AF_CONTROL_EQUALIZER_GAIN | AF_CONTROL_SET, &tmp); | |
1370 } | |
1371 } | |
1372 } | |
1373 | |
1374 return NULL; | |
1375 } | |
1376 } | |
1377 | |
1378 return NULL; | |
23077 | 1379 } |
1380 | |
32984 | 1381 // This function adds/inserts one file into the gui playlist. |
1382 static int import_file_into_gui(char *temp, int insert) | |
1383 { | |
1384 char *filename, *pathname; | |
1385 plItem *item; | |
23077 | 1386 |
32984 | 1387 filename = strdup(mp_basename(temp)); |
1388 pathname = strdup(temp); | |
1389 | |
1390 if (strlen(pathname) - strlen(filename) > 0) | |
1391 pathname[strlen(pathname) - strlen(filename) - 1] = 0; // we have some path, so remove / at end | |
1392 else | |
1393 pathname[strlen(pathname) - strlen(filename)] = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1394 |
32984 | 1395 // NOTE TO MYSELF: FIXME: Change to MSGL_DBG2? |
1396 mp_msg(MSGT_PLAYTREE, MSGL_V, "Adding filename %s && pathname %s\n", filename, pathname); | |
1397 | |
1398 item = calloc(1, sizeof(plItem)); | |
1399 | |
1400 if (!item) | |
1401 return 0; | |
1402 | |
1403 item->name = filename; | |
1404 item->path = pathname; | |
1405 | |
1406 if (insert) | |
1407 gtkSet(gtkInsertPlItem, 0, (void *)item); // inserts the item after current, and makes current=item | |
1408 else | |
1409 gtkSet(gtkAddPlItem, 0, (void *)item); | |
1410 | |
1411 return 1; | |
23077 | 1412 } |
1413 | |
32984 | 1414 // This function imports the initial playtree (based on cmd-line files) |
1415 // into the gui playlist by either: | |
1416 // - overwriting gui pl (enqueue=0) | |
1417 // - appending it to gui pl (enqueue=1) | |
1418 int import_initial_playtree_into_gui(play_tree_t *my_playtree, m_config_t *config, int enqueue) | |
1419 { | |
1420 play_tree_iter_t *my_pt_iter = NULL; | |
1421 int result = 0; | |
23077 | 1422 |
32984 | 1423 if (!enqueue) |
1424 gtkSet(gtkDelPl, 0, 0); // delete playlist before "appending" | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1425 |
32984 | 1426 if ((my_pt_iter = pt_iter_create(&my_playtree, config))) { |
1427 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
1428 // add it to end of list | |
1429 if (import_file_into_gui(filename, 0)) | |
1430 result = 1; | |
23077 | 1431 } |
1432 | |
32984 | 1433 mplCurr(); // update filename |
1434 mplGotoTheNext = 1; | |
23077 | 1435 |
32984 | 1436 if (!enqueue) |
1437 filename = guiIntfStruct.Filename; // Backward compatibility; if file is specified on commandline, | |
1438 // gmplayer does directly start in Play-Mode. | |
1439 else | |
1440 filename = NULL; | |
23077 | 1441 |
32984 | 1442 return result; |
23077 | 1443 } |
1444 | |
32984 | 1445 // This function imports and inserts an playtree, that is created "on the fly", |
1446 // for example by parsing some MOV-Reference-File; or by loading an playlist | |
1447 // with "File Open". | |
23077 | 1448 // The file which contained the playlist is thereby replaced with it's contents. |
32984 | 1449 int import_playtree_playlist_into_gui(play_tree_t *my_playtree, m_config_t *config) |
1450 { | |
1451 play_tree_iter_t *my_pt_iter = NULL; | |
1452 int result = 0; | |
1453 plItem *save; | |
23077 | 1454 |
32984 | 1455 save = (plItem *)gtkSet(gtkGetCurrPlItem, 0, 0); // save current item |
23077 | 1456 |
32984 | 1457 if ((my_pt_iter = pt_iter_create(&my_playtree, config))) { |
1458 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
1459 // insert it into the list and set plCurrent=new item | |
1460 if (import_file_into_gui(filename, 1)) | |
1461 result = 1; | |
1462 | |
1463 pt_iter_destroy(&my_pt_iter); | |
23077 | 1464 } |
1465 | |
32984 | 1466 if (save) |
1467 gtkSet(gtkSetCurrPlItem, 0, (void *)save); | |
1468 else | |
1469 gtkSet(gtkSetCurrPlItem, 0, (void *)plList); // go to head, if plList was empty before | |
23077 | 1470 |
32984 | 1471 if (save && result) |
1472 gtkSet(gtkDelCurrPlItem, 0, 0); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1473 |
32984 | 1474 mplCurr(); // update filename |
1475 filename = NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27393
diff
changeset
|
1476 |
32984 | 1477 return result; |
23077 | 1478 } |
33023 | 1479 |
1480 // NOTE TO MYSELF: This function is nonsense. | |
1481 // MPlayer should pass messages to the GUI | |
1482 // which must decide then which message has | |
1483 // to be shown (MSGL_FATAL, for example). | |
1484 // But with this function it is at least | |
1485 // possible to show GUI's very critical or | |
1486 // abort messages. | |
1487 void gmp_msg(int mod, int lev, const char *format, ...) | |
1488 { | |
1489 char msg[512]; | |
1490 va_list va; | |
1491 | |
1492 va_start(va, format); | |
1493 vsnprintf(msg, sizeof(msg), format, va); | |
1494 va_end(va); | |
1495 | |
1496 mp_msg(mod, lev, msg); | |
1497 | |
1498 if (mp_msg_test(mod, lev)) | |
1499 gtkMessageBox(GTK_MB_FATAL, msg); | |
1500 } |