Mercurial > mplayer.hg
annotate gui/win32/interface.c @ 34115:3d7ee643b110
Port to Wine.
This makes MPlayer and the GUI compile and run as a Wine executable,
which is mainly to allow Windows code checking in a Linux environment.
In Makefile: Generalize the windres call by specifying option "-o" for
the output file.
In gui/win32/interface.c: Use the same function to create a thread as
Cygwin, and convert Windows style file names so that they are accessible
in the Linux environment.
In osdep/priority.c: Include windows.h.
In configure: Add system "Wine" which shall be considered (mostly) a
win32 system. Since winegcc by default compiles all files with the
"-fpic" flag, remove it, and remove all MinGW compatibility WIN32
defines, because we're not compiling for real Windows. Define to not use
Windows sockets (Wine uses different ones) and replace Windows' stricmp
by strcasecmp. Ensure that yasm's object format isn't win32 and that
HAVE_LINUX_DVD_STRUCT will be defined.
In stream/tvi_dshow.c: Define MP_DEFINE_LOCAL_GUID, because Wine's
DEFINE_GUID macro isn't compatible using "static" with it.
In loader/com.h: Rename the IIDs to become local ones, because Wine's
unknwn.h not only declares but defines them.
In mplayer.c: Don't define a SIGSEGV signal handler, or the Wine
executable will crash.
author | ib |
---|---|
date | Sat, 15 Oct 2011 13:20:52 +0000 |
parents | b77b5e7bee72 |
children | 39ca8e25ba79 |
rev | line source |
---|---|
23077 | 1 /* |
23079 | 2 * MPlayer GUI for Win32 |
3 * Copyright (C) 2003 Sascha Sommer <saschasommer@freenet.de> | |
4 * Copyright (C) 2006 Erik Augustson <erik_27can@yahoo.com> | |
5 * Copyright (C) 2006 Gianluigi Tiesi <sherpya@netfarm.it> | |
6 * | |
7 * This file is part of MPlayer. | |
8 * | |
9 * MPlayer is free software; you can redistribute it and/or modify | |
10 * it under the terms of the GNU General Public License as published by | |
11 * the Free Software Foundation; either version 2 of the License, or | |
12 * (at your option) any later version. | |
13 * | |
14 * MPlayer is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 * GNU General Public License for more details. | |
18 * | |
26457 | 19 * You should have received a copy of the GNU General Public License along |
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
23079 | 22 */ |
23077 | 23 |
24 #include <windows.h> | |
33358 | 25 |
34115 | 26 #if defined(__CYGWIN__) || defined(__WINE__) |
33358 | 27 #define _beginthreadex CreateThread |
28 #else | |
29 #include <process.h> | |
30 #endif | |
31 | |
30901 | 32 #include "path.h" |
26372
76413880bfad
Update include paths to account for build system changes.
diego
parents:
26193
diff
changeset
|
33 #include "gui/interface.h" |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
34 #include "m_option.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
35 #include "mixer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
36 #include "mp_msg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
37 #include "help_mp.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
38 #include "codec-cfg.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
39 #include "stream/stream.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
40 #include "libmpdemux/demuxer.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
41 #include "libmpdemux/stheader.h" |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
42 #ifdef CONFIG_DVDREAD |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
43 #include "stream/stream_dvd.h" |
23077 | 44 #endif |
23091
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
45 #include "input/input.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
46 #include "libvo/video_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
47 #include "libao2/audio_out.h" |
52488bb09d90
Consistently use quotes instead of angled brackets in #include
diego
parents:
23079
diff
changeset
|
48 #include "access_mpcontext.h" |
30558 | 49 #include "libmpcodecs/vd.h" |
31425
2392ad3cec9c
Move af_cfg extern variable declaration to dec_audio.h.
diego
parents:
31312
diff
changeset
|
50 #include "libmpcodecs/dec_audio.h" |
33761 | 51 #include "gui/ui/actions.h" |
33557 | 52 #include "gui/ui/gmplayer.h" |
33770 | 53 #include "gui/util/mem.h" |
33761 | 54 #include "gui/util/list.h" |
55 #include "gui/util/string.h" | |
30558 | 56 #include "mp_core.h" |
32093 | 57 #include "mpcommon.h" |
23077 | 58 #include "gui.h" |
59 #include "dialogs.h" | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
60 #ifdef CONFIG_LIBCDIO |
23077 | 61 #include <cdio/cdio.h> |
62 #endif | |
63 | |
64 int guiWinID = 0; | |
65 | |
66 char *skinName = NULL; | |
67 char *codecname = NULL; | |
33555 | 68 int uiGotoTheNext = 1; |
23077 | 69 static gui_t *mygui = NULL; |
70 static int update_subwindow(void); | |
71 static RECT old_rect; | |
72 static DWORD style; | |
24992 | 73 static HANDLE hThread; |
74 static unsigned threadId; | |
25765
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
75 const ao_functions_t *audio_out = NULL; |
304fc0bbefe1
audio_out / video_out structs should be treated as const
reimar
parents:
24992
diff
changeset
|
76 const vo_functions_t *video_out = NULL; |
23077 | 77 mixer_t *mixer = NULL; |
78 | |
79 /* test for playlist files, no need to specify -playlist on the commandline. | |
80 * add any conceivable playlist extensions here. | |
81 * - Erik | |
82 */ | |
83 int parse_filename(char *file, play_tree_t *playtree, m_config_t *mconfig, int clear) | |
84 { | |
85 if(clear) | |
86 mygui->playlist->clear_playlist(mygui->playlist); | |
87 | |
88 if(strstr(file, ".m3u") || strstr(file, ".pls")) | |
89 { | |
90 playtree = parse_playlist_file(file); | |
33752 | 91 guiPlaylistAdd(playtree, mconfig); |
23077 | 92 return 1; |
93 } | |
94 return 0; | |
95 } | |
96 | |
97 /* this function gets called by the gui to update mplayer */ | |
98 static void guiSetEvent(int event) | |
99 { | |
33555 | 100 if(guiInfo.mpcontext) |
101 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
23077 | 102 |
103 switch(event) | |
104 { | |
105 case evPlay: | |
106 case evPlaySwitchToPause: | |
23148
71efd1fc20c8
add missing case value, fixes functionality when using some skins.
vayne
parents:
23147
diff
changeset
|
107 case evPauseSwitchToPlay: |
33555 | 108 uiPlay(); |
23077 | 109 break; |
110 case evPause: | |
33555 | 111 uiPause(); |
23077 | 112 break; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
113 #ifdef CONFIG_DVDREAD |
23077 | 114 case evPlayDVD: |
115 { | |
116 static char dvdname[MAX_PATH]; | |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
117 guiInfo.Track = dvd_title; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
118 guiInfo.Chapter = dvd_chapter; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
119 guiInfo.Angle = dvd_angle; |
33890 | 120 guiInfo.NewPlay = GUI_FILE_SAME; |
23077 | 121 |
33555 | 122 uiSetFileName(NULL, dvd_device, STREAMTYPE_DVD); |
23077 | 123 dvdname[0] = 0; |
124 strcat(dvdname, "DVD Movie"); | |
125 GetVolumeInformation(dvd_device, dvdname, MAX_PATH, NULL, NULL, NULL, NULL, 0); | |
126 capitalize(dvdname); | |
127 mp_msg(MSGT_GPLAYER, MSGL_V, "Opening DVD %s -> %s\n", dvd_device, dvdname); | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
128 gui(GUI_PREPARE, (void *) STREAMTYPE_DVD); |
23077 | 129 mygui->playlist->clear_playlist(mygui->playlist); |
130 mygui->playlist->add_track(mygui->playlist, filename, NULL, dvdname, 0); | |
131 mygui->startplay(mygui); | |
132 break; | |
133 } | |
134 #endif | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
135 #ifdef CONFIG_LIBCDIO |
23077 | 136 case evPlayCD: |
137 { | |
138 int i; | |
139 char track[10]; | |
140 char trackname[10]; | |
141 CdIo_t *p_cdio = cdio_open(NULL, DRIVER_UNKNOWN); | |
142 track_t i_tracks; | |
143 | |
144 if(p_cdio == NULL) printf("Couldn't find a driver.\n"); | |
145 i_tracks = cdio_get_num_tracks(p_cdio); | |
146 | |
147 mygui->playlist->clear_playlist(mygui->playlist); | |
148 for(i=0;i<i_tracks;i++) | |
149 { | |
150 sprintf(track, "cdda://%d", i+1); | |
151 sprintf(trackname, "Track %d", i+1); | |
152 mygui->playlist->add_track(mygui->playlist, track, NULL, trackname, 0); | |
153 } | |
154 cdio_destroy(p_cdio); | |
155 mygui->startplay(mygui); | |
156 break; | |
157 } | |
158 #endif | |
159 case evFullScreen: | |
160 mp_input_queue_cmd(mp_input_parse_cmd("vo_fullscreen")); | |
161 break; | |
162 case evExit: | |
163 { | |
164 /* We are asking mplayer to exit, later it will ask us after uninit is made | |
165 this should be the only safe way to quit */ | |
166 mygui->activewidget = NULL; | |
167 mp_input_queue_cmd(mp_input_parse_cmd("quit")); | |
168 break; | |
169 } | |
170 case evStop: | |
33555 | 171 if(guiInfo.Playing) |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
172 gui(GUI_SET_STATE, (void *) GUI_STOP); |
23077 | 173 break; |
174 case evSetMoviePosition: | |
175 { | |
33555 | 176 rel_seek_secs = guiInfo.Position / 100.0f; |
23077 | 177 abs_seek_pos = 3; |
178 break; | |
179 } | |
180 case evForward10sec: | |
181 { | |
182 rel_seek_secs = 10.0f; | |
183 abs_seek_pos = 0; | |
184 break; | |
185 } | |
186 case evBackward10sec: | |
187 { | |
188 rel_seek_secs = -10.0f; | |
189 abs_seek_pos = 0; | |
190 break; | |
191 } | |
192 case evSetBalance: | |
193 case evSetVolume: | |
194 { | |
195 float l,r; | |
196 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
197 if (guiInfo.Playing == GUI_STOP) |
23077 | 198 break; |
199 | |
33555 | 200 if (guiInfo.Balance == 50.0f) |
201 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); | |
23077 | 202 |
33555 | 203 l = guiInfo.Volume * ((100.0f - guiInfo.Balance) / 50.0f); |
204 r = guiInfo.Volume * ((guiInfo.Balance) / 50.0f); | |
23077 | 205 |
33555 | 206 if (l > guiInfo.Volume) l=guiInfo.Volume; |
207 if (r > guiInfo.Volume) r=guiInfo.Volume; | |
23077 | 208 mixer_setvolume(mixer, l, r); |
209 /* Check for balance support on mixer - there is a better way ?? */ | |
210 if (r != l) | |
211 { | |
212 mixer_getvolume(mixer, &l, &r); | |
213 if (r == l) | |
214 { | |
215 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Mixer doesn't support balanced audio\n"); | |
33555 | 216 mixer_setvolume(mixer, guiInfo.Volume, guiInfo.Volume); |
217 guiInfo.Balance = 50.0f; | |
23077 | 218 } |
219 } | |
220 break; | |
221 } | |
222 case evMute: | |
223 { | |
224 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
225 cmd->id=MP_CMD_MUTE; | |
226 cmd->name=strdup("mute"); | |
227 mp_input_queue_cmd(cmd); | |
228 break; | |
229 } | |
230 case evDropFile: | |
231 case evLoadPlay: | |
232 { | |
33555 | 233 switch(guiInfo.StreamType) |
23077 | 234 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
235 #ifdef CONFIG_DVDREAD |
23077 | 236 case STREAMTYPE_DVD: |
237 { | |
33890 | 238 guiInfo.NewPlay = GUI_FILE_SAME; |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
239 gui(GUI_SET_STATE, (void *) GUI_PLAY); |
23077 | 240 break; |
241 } | |
23147
21c35763b178
compilation fix for disabling dvd functionality, patch by <bangbangbear at gmail dot com>, slightly modified by me.
vayne
parents:
23123
diff
changeset
|
242 #endif |
23077 | 243 default: |
244 { | |
33890 | 245 guiInfo.NewPlay = GUI_FILE_NEW; |
23077 | 246 update_playlistwindow(); |
33555 | 247 uiGotoTheNext = guiInfo.Playing? 0 : 1; |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
248 gui(GUI_SET_STATE, (void *) GUI_STOP); |
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
249 gui(GUI_SET_STATE, (void *) GUI_PLAY); |
23077 | 250 break; |
251 } | |
252 } | |
253 break; | |
254 } | |
255 case evNext: | |
33555 | 256 uiNext(); |
23077 | 257 break; |
258 case evPrev: | |
33555 | 259 uiPrev(); |
23077 | 260 break; |
261 } | |
262 } | |
263 | |
33555 | 264 void uiPlay( void ) |
23077 | 265 { |
33555 | 266 if((!guiInfo.Filename ) || (guiInfo.Filename[0] == 0)) |
23077 | 267 return; |
268 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
269 if(guiInfo.Playing > GUI_STOP) |
23077 | 270 { |
33555 | 271 uiPause(); |
23077 | 272 return; |
273 } | |
33890 | 274 guiInfo.NewPlay = GUI_FILE_NEW; |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
275 gui(GUI_SET_STATE, (void *) GUI_PLAY); |
23077 | 276 } |
277 | |
33555 | 278 void uiPause( void ) |
23077 | 279 { |
33555 | 280 if(!guiInfo.Playing) return; |
23077 | 281 |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
282 if(guiInfo.Playing == GUI_PLAY) |
23077 | 283 { |
284 mp_cmd_t * cmd = calloc(1, sizeof(*cmd)); | |
285 cmd->id=MP_CMD_PAUSE; | |
286 cmd->name=strdup("pause"); | |
287 mp_input_queue_cmd(cmd); | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
288 } else guiInfo.Playing = GUI_PLAY; |
23077 | 289 } |
290 | |
33555 | 291 void uiNext(void) |
23077 | 292 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
293 if(guiInfo.Playing == GUI_PAUSE) return; |
33555 | 294 switch(guiInfo.StreamType) |
23077 | 295 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
296 #ifdef CONFIG_DVDREAD |
23077 | 297 case STREAMTYPE_DVD: |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
298 if(guiInfo.Chapter == (guiInfo.Chapters - 1)) |
23077 | 299 return; |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
300 guiInfo.Chapter++; |
23077 | 301 break; |
302 #endif | |
303 default: | |
304 if(mygui->playlist->current == (mygui->playlist->trackcount - 1)) | |
305 return; | |
33555 | 306 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, |
34075 | 307 STREAMTYPE_FILE); |
23077 | 308 break; |
309 } | |
310 mygui->startplay(mygui); | |
311 } | |
312 | |
33555 | 313 void uiPrev(void) |
23077 | 314 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
315 if(guiInfo.Playing == GUI_PAUSE) return; |
33555 | 316 switch(guiInfo.StreamType) |
23077 | 317 { |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
318 #ifdef CONFIG_DVDREAD |
23077 | 319 case STREAMTYPE_DVD: |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
320 if(guiInfo.Chapter == 1) |
23077 | 321 return; |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
322 guiInfo.Chapter--; |
23077 | 323 break; |
324 #endif | |
325 default: | |
326 if(mygui->playlist->current == 0) | |
327 return; | |
33555 | 328 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)--]->filename, |
34075 | 329 STREAMTYPE_FILE); |
23077 | 330 break; |
331 } | |
332 mygui->startplay(mygui); | |
333 } | |
334 | |
34115 | 335 #ifdef __WINE__ |
336 /** | |
337 * @brief Convert a Windows style file name into an Unix style one. | |
338 * | |
339 * @param filename pointer to the file name to be converted | |
340 * | |
341 * @return pointer to the converted file name | |
342 */ | |
343 static char *unix_name (char *filename) | |
344 { | |
345 static char *unix_filename; | |
346 LPSTR (*CDECL wine_get_unix_file_name_ptr)(LPCWSTR); | |
347 int wchar_conv; | |
348 | |
349 if (*filename && (filename[1] == ':')) | |
350 { | |
351 wine_get_unix_file_name_ptr = (void *) GetProcAddress(GetModuleHandleA("KERNEL32"), "wine_get_unix_file_name"); | |
352 wchar_conv = MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, NULL, 0); | |
353 | |
354 if (wine_get_unix_file_name_ptr && wchar_conv) | |
355 { | |
356 WCHAR *ntpath; | |
357 char *unix_name; | |
358 | |
359 ntpath = HeapAlloc(GetProcessHeap(), 0, sizeof(*ntpath) * (wchar_conv + 1)); | |
360 MultiByteToWideChar(CP_UNIXCP, 0, filename, -1, ntpath, wchar_conv); | |
361 unix_name = wine_get_unix_file_name_ptr(ntpath); | |
362 setdup(&unix_filename, unix_name); | |
363 filename = unix_filename; | |
364 HeapFree(GetProcessHeap(), 0, unix_name); | |
365 HeapFree(GetProcessHeap(), 0, ntpath); | |
366 } | |
367 } | |
368 | |
369 return filename; | |
370 } | |
371 #endif | |
372 | |
33555 | 373 void uiSetFileName(char *dir, char *name, int type) |
23077 | 374 { |
375 if(!name) return; | |
376 if(!dir) | |
33740
2c02269701bd
Remove macros guiSetFilename() and guiSetDF() from interface.h.
ib
parents:
33737
diff
changeset
|
377 setdup(&guiInfo.Filename, name); |
23077 | 378 else |
33740
2c02269701bd
Remove macros guiSetFilename() and guiSetDF() from interface.h.
ib
parents:
33737
diff
changeset
|
379 setddup(&guiInfo.Filename, dir, name); |
23077 | 380 |
34064 | 381 filename = guiInfo.Filename; |
34115 | 382 #ifdef __WINE__ |
383 filename = unix_name(filename); | |
384 #endif | |
33555 | 385 guiInfo.StreamType = type; |
34064 | 386 |
33897 | 387 nfree(guiInfo.AudioFilename); |
388 nfree(guiInfo.SubtitleFilename); | |
23077 | 389 } |
390 | |
33555 | 391 void uiFullScreen( void ) |
23077 | 392 { |
33555 | 393 if(!guiInfo.sh_video) return; |
23077 | 394 |
395 if(sub_window) | |
396 { | |
397 if(!fullscreen && IsWindowVisible(mygui->subwindow) && !IsIconic(mygui->subwindow)) | |
398 GetWindowRect(mygui->subwindow, &old_rect); | |
399 | |
400 if(fullscreen) | |
401 { | |
402 fullscreen = 0; | |
403 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; | |
404 } else { | |
405 fullscreen = 1; | |
406 style = WS_VISIBLE | WS_POPUP; | |
407 } | |
408 SetWindowLong(mygui->subwindow, GWL_STYLE, style); | |
409 update_subwindow(); | |
410 } | |
411 video_out->control(VOCTRL_FULLSCREEN, 0); | |
412 if(sub_window) ShowWindow(mygui->subwindow, SW_SHOW); | |
413 } | |
414 | |
24992 | 415 static unsigned __stdcall GuiThread(void* param) |
23077 | 416 { |
417 MSG msg; | |
418 | |
419 if(!skinName) skinName = strdup("Blue"); | |
33781 | 420 if(!mygui) mygui = create_gui(get_path("skins"), guiSetEvent); |
30558 | 421 if(!mygui) exit_player(EXIT_ERROR); |
23077 | 422 |
423 if(autosync && autosync != gtkAutoSync) | |
424 { | |
425 gtkAutoSyncOn = 1; | |
426 gtkAutoSync = autosync; | |
427 } | |
428 | |
24992 | 429 while(GetMessage(&msg, NULL, 0, 0)) |
23077 | 430 { |
431 TranslateMessage(&msg); | |
432 DispatchMessage(&msg); | |
433 } | |
23078 | 434 fprintf(stderr, "[GUI] GUI thread terminated.\n"); |
23077 | 435 fflush(stderr); |
436 return 0; | |
437 } | |
438 | |
439 void guiInit(void) | |
440 { | |
33555 | 441 memset(&guiInfo, 0, sizeof(guiInfo)); |
23077 | 442 /* Create The gui thread */ |
443 if (!mygui) | |
444 { | |
33358 | 445 hThread = _beginthreadex(NULL, 0, GuiThread, NULL, 0, &threadId); |
23077 | 446 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Creating GUI Thread 0x%04x\n", threadId); |
447 } | |
448 | |
449 /* Wait until the gui is created */ | |
450 while(!mygui) Sleep(100); | |
23078 | 451 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] GUI thread started.\n"); |
23077 | 452 } |
453 | |
454 void guiDone(void) | |
455 { | |
456 if(mygui) | |
457 { | |
458 fprintf(stderr, "[GUI] Closed by main mplayer window\n"); | |
459 fflush(stderr); | |
24992 | 460 PostThreadMessage(threadId, WM_QUIT, 0, 0); |
461 WaitForSingleObject(hThread, INFINITE); | |
462 CloseHandle(hThread); | |
23077 | 463 mygui->uninit(mygui); |
33770 | 464 nfree(mygui); |
23077 | 465 } |
466 /* Remove tray icon */ | |
467 Shell_NotifyIcon(NIM_DELETE, &nid); | |
468 cfg_write(); | |
469 } | |
470 | |
471 /* this function gets called by mplayer to update the gui */ | |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
472 int gui(int what, void *data) |
23077 | 473 { |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
474 stream_t *stream = data; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
475 #ifdef CONFIG_DVDREAD |
33730 | 476 dvd_priv_t *dvdp; |
23077 | 477 #endif |
478 if(!mygui || !mygui->skin) return 0; | |
479 | |
33555 | 480 if(guiInfo.mpcontext) |
23077 | 481 { |
33555 | 482 audio_out = mpctx_get_audio_out(guiInfo.mpcontext); |
483 video_out = mpctx_get_video_out(guiInfo.mpcontext); | |
484 mixer = mpctx_get_mixer(guiInfo.mpcontext); | |
485 playtree = mpctx_get_playtree_iter(guiInfo.mpcontext); | |
23077 | 486 } |
487 | |
33726 | 488 switch (what) |
23077 | 489 { |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
490 case GUI_PREPARE: |
23077 | 491 { |
34052 | 492 audio_id = -1; |
493 video_id = -1; | |
494 dvdsub_id = -1; | |
495 vobsub_id = -1; | |
496 stream_cache_size = -1; | |
497 autosync = 0; | |
498 dvd_title = 0; | |
499 force_fps = 0; | |
500 if(!mygui->playlist->tracks) return 0; | |
34065
8a7056729022
Change guiInfo.Filename by using uiSetFileName() only.
ib
parents:
34064
diff
changeset
|
501 uiSetFileName(NULL, mygui->playlist->tracks[mygui->playlist->current]->filename, STREAMTYPE_FILE); |
34052 | 502 guiInfo.Track = mygui->playlist->current + 1; |
503 if(gtkAONorm) greplace(&af_cfg.list, "volnorm", "volnorm"); | |
504 if(gtkAOExtraStereo) | |
505 { | |
506 char *name = malloc(12 + 20 + 1); | |
507 snprintf(name, 12 + 20, "extrastereo=%f", gtkAOExtraStereoMul); | |
508 name[12 + 20] = 0; | |
509 greplace(&af_cfg.list, "extrastereo", name); | |
510 free(name); | |
511 } | |
512 if(gtkCacheOn) stream_cache_size = gtkCacheSize; | |
513 if(gtkAutoSyncOn) autosync = gtkAutoSync; | |
33555 | 514 guiInfo.NewPlay = 0; |
515 switch(guiInfo.StreamType) | |
23077 | 516 { |
34073 | 517 case STREAMTYPE_FILE: |
518 case STREAMTYPE_STREAM: | |
23077 | 519 break; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
520 #ifdef CONFIG_DVDREAD |
23077 | 521 case STREAMTYPE_DVD: |
522 { | |
523 char tmp[512]; | |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
524 dvd_title = guiInfo.Track; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
525 dvd_chapter = guiInfo.Chapter; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
526 dvd_angle = guiInfo.Angle; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
527 sprintf(tmp,"dvd://%d", guiInfo.Track); |
34065
8a7056729022
Change guiInfo.Filename by using uiSetFileName() only.
ib
parents:
34064
diff
changeset
|
528 uiSetFileName(NULL, tmp, STREAMTYPE_DVD); |
23077 | 529 break; |
530 } | |
531 #endif | |
532 } | |
533 break; | |
534 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
535 case GUI_SET_AUDIO: |
23077 | 536 { |
33901 | 537 guiInfo.VideoWindow = (data && !guiInfo.sh_video); |
33661 | 538 // NOTE: This type doesn't mean (and never meant) that we have |
539 // *just* audio, so there probably should be a check before | |
540 // hiding (see gui/interface.c). | |
23077 | 541 if(IsWindowVisible(mygui->subwindow)) |
542 ShowWindow(mygui->subwindow, SW_HIDE); | |
543 break; | |
544 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
545 case GUI_SET_CONTEXT: |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
546 guiInfo.mpcontext = data; |
23077 | 547 break; |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
548 case GUI_SET_VIDEO: |
23077 | 549 { |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
550 guiInfo.sh_video = data; |
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
551 if (data) |
23077 | 552 { |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
553 sh_video_t *sh = data; |
23077 | 554 codecname = sh->codec->name; |
555 | |
556 /* we have video, show the subwindow */ | |
557 if(!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) | |
558 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); | |
559 if(WinID == -1) | |
560 update_subwindow(); | |
561 | |
562 } | |
563 break; | |
564 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
565 case GUI_SETUP_VIDEO_WINDOW: |
23077 | 566 { |
33901 | 567 guiInfo.VideoWidth = vo_dwidth; |
568 guiInfo.VideoHeight = vo_dheight; | |
23077 | 569 |
33901 | 570 sub_aspect = (float)guiInfo.VideoWidth/guiInfo.VideoHeight; |
23077 | 571 if(WinID != -1) |
572 update_subwindow(); | |
573 break; | |
574 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
575 case GUI_SET_STREAM: |
23077 | 576 { |
33555 | 577 guiInfo.StreamType = stream->type; |
23077 | 578 switch(stream->type) |
579 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26457
diff
changeset
|
580 #ifdef CONFIG_DVDREAD |
23077 | 581 case STREAMTYPE_DVD: |
33730 | 582 dvdp = stream->priv; |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
583 guiInfo.Tracks = dvdp->vmg_file->tt_srpt->nr_of_srpts; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
584 guiInfo.Chapters = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
585 guiInfo.Angles = dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; |
33902 | 586 guiInfo.AudioStreams = dvdp->nr_of_channels; |
587 memcpy(guiInfo.AudioStream, dvdp->audio_streams, sizeof(dvdp->audio_streams)); | |
588 guiInfo.Subtitles = dvdp->nr_of_subtitles; | |
589 memcpy(guiInfo.Subtitle, dvdp->subtitles, sizeof(dvdp->subtitles)); | |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
590 guiInfo.Chapter = dvd_chapter + 1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
591 guiInfo.Angle = dvd_angle + 1; |
33730 | 592 guiInfo.Track = dvd_title + 1; |
23077 | 593 break; |
594 #endif | |
595 } | |
596 break; | |
597 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
598 case GUI_REDRAW: |
23077 | 599 mygui->updatedisplay(mygui, mygui->mainwindow); |
600 break; | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
601 case GUI_SET_AFILTER: |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
602 guiInfo.afilter = data; |
23077 | 603 break; |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
604 case GUI_SET_STATE: |
23077 | 605 { |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
606 guiInfo.Playing = (int) data; |
33555 | 607 switch (guiInfo.Playing) |
23077 | 608 { |
33614 | 609 case GUI_PLAY: |
23077 | 610 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
611 guiInfo.Playing = GUI_PLAY; |
23077 | 612 break; |
613 } | |
33614 | 614 case GUI_STOP: |
23077 | 615 { |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
616 guiInfo.Playing = GUI_STOP; |
23077 | 617 if(movie_aspect >= 0) |
618 movie_aspect = -1; | |
619 update_subwindow(); | |
620 break; | |
621 } | |
33614 | 622 case GUI_PAUSE: |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
623 guiInfo.Playing = GUI_PAUSE; |
23077 | 624 break; |
625 } | |
626 break; | |
627 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
628 case GUI_RUN_COMMAND: |
23077 | 629 { |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
630 mp_msg(MSGT_GPLAYER,MSGL_V, "cmd: %d\n", (int) data); |
23077 | 631 /* MPlayer asks us to quit */ |
33791
8b0c78a85a8c
Cosmetic: Change parameter names of gui() and mplayer().
ib
parents:
33781
diff
changeset
|
632 switch((int) data) |
23077 | 633 { |
31312
0b7792622c88
Remove Gui-specific slave commands and associated key-bindings and other code.
reimar
parents:
30901
diff
changeset
|
634 case MP_CMD_VO_FULLSCREEN: |
33555 | 635 uiFullScreen(); |
23077 | 636 break; |
637 case MP_CMD_QUIT: | |
638 { | |
639 mygui->uninit(mygui); | |
33770 | 640 nfree(mygui); |
30558 | 641 exit_player(EXIT_QUIT); |
33666
0f592e8530f1
Change return code of guiGetEvent() to indicate success.
ib
parents:
33661
diff
changeset
|
642 return 1; |
23077 | 643 } |
33696
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
644 case MP_CMD_PLAY_TREE_STEP: |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
645 guiSetEvent(evNext); |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
646 break; |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
647 case -MP_CMD_PLAY_TREE_STEP: |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
648 guiSetEvent(evPrev); |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
649 break; |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
650 case MP_CMD_STOP: |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
651 guiSetEvent(evStop); |
24d919fb6778
Don't let MPlayer directly call user interface functions.
ib
parents:
33695
diff
changeset
|
652 break; |
23077 | 653 default: |
654 break; | |
655 } | |
656 break; | |
657 } | |
33732 | 658 case GUI_HANDLE_EVENTS: |
659 break; | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
660 case GUI_SET_MIXER: |
23077 | 661 { |
662 if(audio_out) | |
663 { | |
664 /* Some audio_out drivers do not support balance e.g. dsound */ | |
665 /* FIXME this algo is not correct */ | |
666 float l, r; | |
667 mixer_getvolume(mixer, &l, &r); | |
33555 | 668 guiInfo.Volume = (r > l ? r : l); /* max(r,l) */ |
23077 | 669 if (r != l) |
33555 | 670 guiInfo.Balance = ((r-l) + 100.0f) * 0.5f; |
23077 | 671 else |
33555 | 672 guiInfo.Balance = 50.0f; |
23077 | 673 } |
674 break; | |
675 } | |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
676 case GUI_END_FILE: |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
677 { |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
678 if(!uiGotoTheNext && guiInfo.Playing) |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
679 { |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
680 uiGotoTheNext = 1; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
681 break; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
682 } |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
683 |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
684 if(uiGotoTheNext && guiInfo.Playing && |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
685 (mygui->playlist->current < (mygui->playlist->trackcount - 1)) && |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
686 guiInfo.StreamType != STREAMTYPE_DVD && |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
687 guiInfo.StreamType != STREAMTYPE_DVDNAV) |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
688 { |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
689 /* we've finished this file, reset the aspect */ |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
690 if(movie_aspect >= 0) |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
691 movie_aspect = -1; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
692 |
33894 | 693 uiGotoTheNext = 1; |
33890 | 694 guiInfo.NewPlay = GUI_FILE_NEW; |
34075 | 695 uiSetFileName(NULL, mygui->playlist->tracks[(mygui->playlist->current)++]->filename, STREAMTYPE_FILE); |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
696 //sprintf(guiInfo.Filename, mygui->playlist->tracks[(mygui->playlist->current)++]->filename); |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
697 } |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
698 |
33894 | 699 if(guiInfo.NewPlay == GUI_FILE_NEW) |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
700 break; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
701 |
33897 | 702 guiInfo.ElapsedTime = 0; |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
703 guiInfo.Position = 0; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
704 guiInfo.AudioChannels = 0; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
705 |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
706 #ifdef CONFIG_DVDREAD |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
707 guiInfo.Track = 1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
708 guiInfo.Chapter = 1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33791
diff
changeset
|
709 guiInfo.Angle = 1; |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
710 #endif |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
711 |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
712 if (mygui->playlist->current == (mygui->playlist->trackcount - 1)) |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
713 mygui->playlist->current = 0; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
714 |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
715 fullscreen = 0; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
716 if(style == WS_VISIBLE | WS_POPUP) |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
717 { |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
718 style = WS_OVERLAPPEDWINDOW | WS_SIZEBOX; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
719 SetWindowLong(mygui->subwindow, GWL_STYLE, style); |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
720 } |
33731
81f71d910333
Cosmetic: Change prefix for symbolic constants from GMP to GUI.
ib
parents:
33730
diff
changeset
|
721 gui(GUI_SET_STATE, (void *) GUI_STOP); |
33694
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
722 break; |
45553d0f65c6
Don't let MPlayer directly call user interface functions.
ib
parents:
33691
diff
changeset
|
723 } |
23077 | 724 default: |
33726 | 725 mp_msg(MSGT_GPLAYER, MSGL_ERR, "[GUI] GOT UNHANDLED EVENT %i\n", what); |
23077 | 726 } |
33666
0f592e8530f1
Change return code of guiGetEvent() to indicate success.
ib
parents:
33661
diff
changeset
|
727 return 1; |
23077 | 728 } |
729 | |
730 /* This function adds/inserts one file into the gui playlist */ | |
33579 | 731 static int import_file_into_gui(char *pathname, int insert) |
23077 | 732 { |
733 char filename[MAX_PATH]; | |
734 char *filepart = filename; | |
735 | |
736 if (strstr(pathname, "://")) | |
737 { | |
738 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding special %s\n", pathname); | |
739 mygui->playlist->add_track(mygui->playlist, pathname, NULL, NULL, 0); | |
740 return 1; | |
741 } | |
742 if (GetFullPathName(pathname, MAX_PATH, filename, &filepart)) | |
743 { | |
744 if (!(GetFileAttributes(filename) & FILE_ATTRIBUTE_DIRECTORY)) | |
745 { | |
746 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Adding filename: %s - fullpath: %s\n", filepart, filename); | |
747 mygui->playlist->add_track(mygui->playlist, filename, NULL, filepart, 0); | |
748 return 1; | |
749 } | |
750 else | |
751 mp_msg(MSGT_GPLAYER, MSGL_V, "[GUI] Cannot add %s\n", filename); | |
752 } | |
753 | |
754 return 0; | |
755 } | |
756 | |
757 /* This function imports the initial playtree (based on cmd-line files) into the gui playlist | |
758 by either: | |
759 - overwriting gui pl (enqueue=0) */ | |
760 | |
33752 | 761 int guiPlaylistInitialize(play_tree_t *my_playtree, m_config_t *config, int enqueue) |
23077 | 762 { |
763 play_tree_iter_t *my_pt_iter = NULL; | |
764 int result = 0; | |
765 | |
766 if(!mygui) guiInit(); | |
767 | |
768 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
769 { | |
770 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
771 { | |
772 if (parse_filename(filename, my_playtree, config, 0)) | |
773 result = 1; | |
774 else if (import_file_into_gui(filename, 0)) /* Add it to end of list */ | |
775 result = 1; | |
776 } | |
777 } | |
33555 | 778 uiGotoTheNext = 1; |
23077 | 779 |
780 if (result) | |
781 { | |
782 mygui->playlist->current = 0; | |
34068 | 783 uiSetFileName(NULL, mygui->playlist->tracks[0]->filename, STREAMTYPE_FILE); |
23077 | 784 } |
34084 | 785 |
786 if (enqueue) filename = NULL; | |
787 | |
23077 | 788 return result; |
789 } | |
790 | |
791 /* This function imports and inserts an playtree, that is created "on the fly", for example by | |
792 parsing some MOV-Reference-File; or by loading an playlist with "File Open" | |
793 The file which contained the playlist is thereby replaced with it's contents. */ | |
794 | |
33752 | 795 int guiPlaylistAdd(play_tree_t *my_playtree, m_config_t *config) |
23077 | 796 { |
797 play_tree_iter_t *my_pt_iter = NULL; | |
798 int result = 0; | |
799 | |
800 if((my_pt_iter = pt_iter_create(&my_playtree, config))) | |
801 { | |
802 while ((filename = pt_iter_get_next_file(my_pt_iter)) != NULL) | |
803 if (import_file_into_gui(filename, 1)) /* insert it into the list and set plCurrent = new item */ | |
804 result = 1; | |
805 pt_iter_destroy(&my_pt_iter); | |
806 } | |
807 return result; | |
808 } | |
809 | |
33579 | 810 static inline void gtkMessageBox(int type, const char *str) |
23077 | 811 { |
812 if (type & GTK_MB_FATAL) | |
813 MessageBox(NULL, str, "MPlayer GUI for Windows Error", MB_OK | MB_ICONERROR); | |
814 | |
815 fprintf(stderr, "[GUI] MessageBox: %s\n", str); | |
816 fflush(stderr); | |
817 } | |
818 | |
819 static int update_subwindow(void) | |
820 { | |
821 int x,y; | |
822 RECT rd; | |
823 WINDOWPOS wp; | |
824 | |
825 if(!sub_window) | |
826 { | |
33567 | 827 WinID = -1; |
23077 | 828 |
33555 | 829 if(IsWindowVisible(mygui->subwindow) && guiInfo.sh_video && guiInfo.Playing) |
23077 | 830 { |
831 ShowWindow(mygui->subwindow, SW_HIDE); | |
832 return 0; | |
833 } | |
33901 | 834 else if(!guiInfo.VideoWindow) |
23077 | 835 return 0; |
836 else ShowWindow(mygui->subwindow, SW_SHOW); | |
837 } | |
838 | |
839 /* we've come out of fullscreen at the end of file */ | |
33901 | 840 if((!IsWindowVisible(mygui->subwindow) || IsIconic(mygui->subwindow)) && guiInfo.VideoWindow) |
23077 | 841 ShowWindow(mygui->subwindow, SW_SHOWNORMAL); |
842 | |
843 /* get our current window coordinates */ | |
844 GetWindowRect(mygui->subwindow, &rd); | |
845 | |
846 x = rd.left; | |
847 y = rd.top; | |
848 | |
849 /* restore sub window position when coming out of fullscreen */ | |
850 if(x <= 0) x = old_rect.left; | |
851 if(y <= 0) y = old_rect.top; | |
852 | |
33555 | 853 if(!guiInfo.Playing) |
23077 | 854 { |
855 window *desc = NULL; | |
856 int i; | |
857 | |
858 for (i=0; i<mygui->skin->windowcount; i++) | |
859 if(mygui->skin->windows[i]->type == wiSub) | |
860 desc = mygui->skin->windows[i]; | |
861 | |
862 rd.right = rd.left+desc->base->bitmap[0]->width; | |
863 rd.bottom = rd.top+desc->base->bitmap[0]->height; | |
864 sub_aspect = (float)(rd.right-rd.left)/(rd.bottom-rd.top); | |
865 } | |
866 else | |
867 { | |
33901 | 868 rd.right = rd.left+guiInfo.VideoWidth; |
869 rd.bottom = rd.top+guiInfo.VideoHeight; | |
23077 | 870 |
871 if (movie_aspect > 0.0) // forced aspect from the cmdline | |
872 sub_aspect = movie_aspect; | |
873 } | |
874 | |
875 | |
876 AdjustWindowRect(&rd, WS_OVERLAPPEDWINDOW | WS_SIZEBOX, 0); | |
877 SetWindowPos(mygui->subwindow, 0, x, y, rd.right-rd.left, rd.bottom-rd.top, SWP_NOOWNERZORDER); | |
878 | |
879 wp.hwnd = mygui->subwindow; | |
880 wp.x = rd.left; | |
881 wp.y = rd.top; | |
882 wp.cx = rd.right-rd.left; | |
883 wp.cy = rd.bottom-rd.top; | |
884 wp.flags = SWP_NOOWNERZORDER | SWP_SHOWWINDOW; | |
885 | |
886 /* erase the bitmap image if there's video */ | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
887 if(guiInfo.Playing != GUI_STOP && guiInfo.sh_video) |
23077 | 888 SendMessage(mygui->subwindow, WM_ERASEBKGND, (WPARAM)GetDC(mygui->subwindow), 0); |
889 | |
890 /* reset the window aspect */ | |
891 SendMessage(mygui->subwindow, WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp); | |
892 return 0; | |
893 } |