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