Mercurial > mplayer.hg
annotate gui/ui/main.c @ 34469:c3f95506f756
Fix bug with switching audio and video tracks.
The track did not change.
This closes Bugzilla #2001.
In addition, switching won't restart playback now.
author | ib |
---|---|
date | Fri, 13 Jan 2012 16:19:35 +0000 |
parents | 1e84148527ab |
children | f866092d51cd |
rev | line source |
---|---|
26458 | 1 /* |
2 * main window | |
3 * | |
4 * This file is part of MPlayer. | |
5 * | |
6 * MPlayer is free software; you can redistribute it and/or modify | |
7 * it under the terms of the GNU General Public License as published by | |
8 * the Free Software Foundation; either version 2 of the License, or | |
9 * (at your option) any later version. | |
10 * | |
11 * MPlayer is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 * GNU General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU General Public License along | |
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
19 */ | |
23077 | 20 |
21 #include <stdlib.h> | |
22 #include <stdio.h> | |
23 #include <sys/stat.h> | |
24 #include <unistd.h> | |
23305
22d3d12c6dfb
Include string.h for memcpy, fastmemcpy.h alone is not enough.
reimar
parents:
23154
diff
changeset
|
25 #include <string.h> |
23077 | 26 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
27 #include "config.h" |
23154
e564b9cd7290
Fix several implicit declarations of functions warnings.
diego
parents:
23077
diff
changeset
|
28 #include "gmplayer.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
29 #include "gui/app.h" |
33738 | 30 #include "gui/interface.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
31 #include "gui/skin/font.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
32 #include "gui/skin/skin.h" |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
33 #include "gui/util/list.h" |
33739 | 34 #include "gui/util/mem.h" |
33737 | 35 #include "gui/util/string.h" |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
36 #include "gui/wm/ws.h" |
23077 | 37 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
38 #include "help_mp.h" |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
34077
diff
changeset
|
39 #include "mp_msg.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
40 #include "libvo/x11_common.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
41 #include "libvo/fastmemcpy.h" |
33531
84ce059fae34
Get non-multimedia X11 key definitions from libvo/wskeys.h.
ib
parents:
33525
diff
changeset
|
42 #include "libvo/wskeys.h" |
23077 | 43 |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
44 #include "stream/stream.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
45 #include "stream/url.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
46 #include "mixer.h" |
32467 | 47 #include "sub/sub.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
48 #include "access_mpcontext.h" |
23077 | 49 |
30537
7bebe34b6ad2
Move movie_aspect extern declaration to libmpcodecs/vd.h.
diego
parents:
30516
diff
changeset
|
50 #include "libmpcodecs/vd.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
51 #include "libmpdemux/demuxer.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
52 #include "libmpdemux/stheader.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
53 #include "codec-cfg.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
54 #include "m_option.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
55 #include "m_property.h" |
30516 | 56 #include "mp_core.h" |
32043
f6249bc89c38
Move extern declarations used by both mplayer.c and mencoder.c to mpcommon.h.
diego
parents:
32041
diff
changeset
|
57 #include "mpcommon.h" |
23077 | 58 |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
59 #define CLEAR_FILE 1 |
34077 | 60 #define CLEAR_VCD 2 |
61 #define CLEAR_DVD 4 | |
62 #define CLEAR_ALL (CLEAR_FILE + CLEAR_VCD + CLEAR_DVD) | |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
63 |
23077 | 64 #define GUI_REDRAW_WAIT 375 |
65 | |
33556 | 66 #include "actions.h" |
23077 | 67 #include "widgets.h" |
68 | |
28051 | 69 unsigned int GetTimerMS( void ); |
23077 | 70 |
33555 | 71 unsigned char * mainDrawBuffer = NULL; |
72 int uiMainRender = 1; | |
23077 | 73 |
33555 | 74 int uiMainAutoPlay = 0; |
75 int uiMiddleMenu = 0; | |
23077 | 76 |
77 int mainVisible = 1; | |
78 | |
79 int boxMoved = 0; | |
80 int sx = 0,sy = 0; | |
81 int i,pot = 0; | |
82 | |
33556 | 83 #include "render.h" |
23077 | 84 |
33555 | 85 void uiMainDraw( void ) |
23077 | 86 { |
87 | |
33768 | 88 if ( guiApp.mainWindow.State == wsWindowClosed ) mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
89 |
33555 | 90 if ( guiApp.mainWindow.Visible == wsWindowNotVisible || |
23077 | 91 !mainVisible ) return; |
33555 | 92 // !guiApp.mainWindow.Mapped ) return; |
23077 | 93 |
33555 | 94 if ( uiMainRender && guiApp.mainWindow.State == wsWindowExpose ) |
23077 | 95 { |
33555 | 96 btnModify( evSetMoviePosition,guiInfo.Position ); |
97 btnModify( evSetVolume,guiInfo.Volume ); | |
23077 | 98 |
33555 | 99 fast_memcpy( mainDrawBuffer,guiApp.main.Bitmap.Image,guiApp.main.Bitmap.ImageSize ); |
100 RenderAll( &guiApp.mainWindow,guiApp.mainItems,guiApp.IndexOfMainItems,mainDrawBuffer ); | |
101 uiMainRender=0; | |
23077 | 102 } |
33555 | 103 wsPutImage( &guiApp.mainWindow ); |
23077 | 104 // XFlush( wsDisplay ); |
105 } | |
106 | |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
107 static void guiInfoMediumClear (int what) |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
108 { |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
109 if (what & CLEAR_FILE) |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
110 { |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
111 nfree(guiInfo.Filename); |
33897 | 112 nfree(guiInfo.SubtitleFilename); |
113 nfree(guiInfo.AudioFilename); | |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
114 listSet(gtkDelPl, NULL); |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
115 } |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
116 |
34077 | 117 if (what & CLEAR_VCD) guiInfo.Tracks = 0; |
118 | |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
119 if (what & CLEAR_DVD) |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
120 { |
33902 | 121 guiInfo.AudioStreams = 0; |
122 guiInfo.Subtitles = 0; | |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
123 guiInfo.Tracks = 0; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
124 guiInfo.Chapters = 0; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
125 guiInfo.Angles = 0; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
126 } |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
127 } |
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
128 |
23077 | 129 static unsigned last_redraw_time = 0; |
130 | |
33555 | 131 void uiEventHandling( int msg,float param ) |
23077 | 132 { |
133 int iparam = (int)param; | |
33555 | 134 mixer_t *mixer = mpctx_get_mixer(guiInfo.mpcontext); |
23077 | 135 |
136 switch( msg ) | |
137 { | |
138 // --- user events | |
139 case evExit: | |
33768 | 140 mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); |
23077 | 141 break; |
142 | |
34324 | 143 case evLoadURL: |
34329 | 144 gtkShow( evLoadURL,NULL ); |
23077 | 145 break; |
146 | |
34333 | 147 case ivSetAudio: |
33657 | 148 if ( !mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam ) break; |
34469 | 149 mp_property_do("switch_audio",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); |
23077 | 150 audio_id=iparam; |
34469 | 151 break; |
23077 | 152 |
34333 | 153 case ivSetVideo: |
33657 | 154 if ( !mpctx_get_demuxer(guiInfo.mpcontext) || video_id == iparam ) break; |
34469 | 155 mp_property_do("switch_video",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); |
23077 | 156 video_id=iparam; |
34469 | 157 break; |
23077 | 158 |
34333 | 159 case ivSetSubtitle: |
33555 | 160 mp_property_do("sub",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); |
23077 | 161 break; |
162 | |
34387 | 163 #ifdef CONFIG_CDDA |
164 case ivSetCDTrack: | |
165 guiInfo.Track=iparam; | |
166 case evPlayCD: | |
167 guiInfoMediumClear ( CLEAR_ALL ); | |
168 guiInfo.StreamType=STREAMTYPE_CDDA; | |
169 goto play; | |
170 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
171 #ifdef CONFIG_VCD |
34333 | 172 case ivSetVCDTrack: |
33555 | 173 guiInfo.Track=iparam; |
23077 | 174 case evPlayVCD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
175 guiInfoMediumClear ( CLEAR_ALL ); |
33555 | 176 guiInfo.StreamType=STREAMTYPE_VCD; |
23077 | 177 goto play; |
178 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
179 #ifdef CONFIG_DVDREAD |
34417 | 180 case ivSetDVDSubtitle: |
181 dvdsub_id=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
182 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 183 break; |
184 case ivSetDVDAudio: | |
185 audio_id=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
186 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 187 break; |
188 case ivSetDVDChapter: | |
189 guiInfo.Chapter=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
190 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 191 break; |
192 case ivSetDVDTitle: | |
193 guiInfo.Track=iparam; | |
194 guiInfo.Chapter=1; | |
195 guiInfo.Angle=1; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
196 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 197 break; |
23077 | 198 case evPlayDVD: |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
199 guiInfo.Track=1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
200 guiInfo.Chapter=1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
201 guiInfo.Angle=1; |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
202 case ivPlayDVD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
203 guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD ); |
33555 | 204 guiInfo.StreamType=STREAMTYPE_DVD; |
23077 | 205 goto play; |
206 #endif | |
207 case evPlay: | |
208 case evPlaySwitchToPause: | |
209 play: | |
210 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
211 if ( ( msg == evPlaySwitchToPause )&&( guiInfo.Playing == GUI_PAUSE ) ) goto NoPause; |
23077 | 212 |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
213 if ( listSet( gtkGetCurrPlItem,NULL ) &&( guiInfo.StreamType == STREAMTYPE_FILE ) ) |
23077 | 214 { |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
215 plItem * next = listSet( gtkGetCurrPlItem,NULL ); |
23077 | 216 plLastPlayed=next; |
34399
f2c03009068d
Don't explicitly set stream type if the type doesn't change.
ib
parents:
34387
diff
changeset
|
217 uiSetFileName( next->path,next->name,SAME_STREAMTYPE ); |
23077 | 218 } |
219 | |
33555 | 220 switch ( guiInfo.StreamType ) |
23077 | 221 { |
34077 | 222 case STREAMTYPE_FILE: |
23077 | 223 case STREAMTYPE_STREAM: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
224 guiInfoMediumClear( CLEAR_ALL - CLEAR_FILE ); |
33898 | 225 if ( !guiInfo.Track ) |
226 guiInfo.Track=1; | |
33890 | 227 guiInfo.NewPlay=GUI_FILE_NEW; |
23077 | 228 break; |
34454 | 229 |
34387 | 230 case STREAMTYPE_CDDA: |
231 guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); | |
232 if ( guiInfo.Playing != GUI_PAUSE ) | |
233 { | |
234 if ( !guiInfo.Track ) | |
235 guiInfo.Track=1; | |
236 guiInfo.NewPlay=GUI_FILE_SAME; | |
237 } | |
238 break; | |
34454 | 239 |
23077 | 240 case STREAMTYPE_VCD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
241 guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
242 if ( guiInfo.Playing != GUI_PAUSE ) |
23077 | 243 { |
33555 | 244 if ( !guiInfo.Track ) |
33874 | 245 guiInfo.Track=2; |
33890 | 246 guiInfo.NewPlay=GUI_FILE_SAME; |
23077 | 247 } |
248 break; | |
34454 | 249 |
23077 | 250 case STREAMTYPE_DVD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
251 guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD - CLEAR_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
252 if ( guiInfo.Playing != GUI_PAUSE ) |
23077 | 253 { |
33890 | 254 guiInfo.NewPlay=GUI_FILE_SAME; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
255 } |
23077 | 256 break; |
257 } | |
33555 | 258 uiPlay(); |
23077 | 259 break; |
260 | |
261 case evPause: | |
262 case evPauseSwitchToPlay: | |
263 NoPause: | |
33555 | 264 uiPause(); |
23077 | 265 break; |
266 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
267 case evStop: |
33614 | 268 guiInfo.Playing=GUI_STOP; |
33555 | 269 uiState(); |
23077 | 270 break; |
271 | |
272 case evLoadPlay: | |
33555 | 273 uiMainAutoPlay=1; |
274 // guiInfo.StreamType=STREAMTYPE_FILE; | |
23077 | 275 case evLoad: |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
276 listSet( gtkDelPl,NULL ); |
23077 | 277 gtkShow( evLoad,NULL ); |
278 break; | |
279 case evLoadSubtitle: gtkShow( evLoadSubtitle,NULL ); break; | |
280 case evDropSubtitle: | |
33897 | 281 nfree( guiInfo.SubtitleFilename ); |
33763 | 282 mplayerLoadSubtitle( NULL ); |
23077 | 283 break; |
284 case evLoadAudioFile: gtkShow( evLoadAudioFile,NULL ); break; | |
33555 | 285 case evPrev: uiPrev(); break; |
286 case evNext: uiNext(); break; | |
23077 | 287 |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34174
diff
changeset
|
288 case evPlaylist: gtkShow( evPlaylist,NULL ); break; |
23077 | 289 case evSkinBrowser: gtkShow( evSkinBrowser,skinName ); break; |
290 case evAbout: gtkShow( evAbout,NULL ); break; | |
291 case evPreferences: gtkShow( evPreferences,NULL ); break; | |
292 case evEqualizer: gtkShow( evEqualizer,NULL ); break; | |
293 | |
33555 | 294 case evForward10min: uiRelSeek( 600 ); break; |
295 case evBackward10min: uiRelSeek( -600 );break; | |
296 case evForward1min: uiRelSeek( 60 ); break; | |
297 case evBackward1min: uiRelSeek( -60 ); break; | |
298 case evForward10sec: uiRelSeek( 10 ); break; | |
299 case evBackward10sec: uiRelSeek( -10 ); break; | |
300 case evSetMoviePosition: uiAbsSeek( param ); break; | |
23077 | 301 |
302 case evIncVolume: vo_x11_putkey( wsGrayMul ); break; | |
303 case evDecVolume: vo_x11_putkey( wsGrayDiv ); break; | |
304 case evMute: mixer_mute( mixer ); break; | |
305 | |
306 case evSetVolume: | |
33555 | 307 guiInfo.Volume=param; |
23077 | 308 goto set_volume; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
309 case evSetBalance: |
33555 | 310 guiInfo.Balance=param; |
23077 | 311 set_volume: |
312 { | |
33555 | 313 float l = guiInfo.Volume * ( ( 100.0 - guiInfo.Balance ) / 50.0 ); |
314 float r = guiInfo.Volume * ( ( guiInfo.Balance ) / 50.0 ); | |
315 if ( l > guiInfo.Volume ) l=guiInfo.Volume; | |
316 if ( r > guiInfo.Volume ) r=guiInfo.Volume; | |
317 // printf( "!!! v: %.2f b: %.2f -> %.2f x %.2f\n",guiInfo.Volume,guiInfo.Balance,l,r ); | |
23077 | 318 mixer_setvolume( mixer,l,r ); |
319 } | |
320 if ( osd_level ) | |
321 { | |
322 osd_visible=(GetTimerMS() + 1000) | 1; | |
323 vo_osd_progbar_type=OSD_VOLUME; | |
33555 | 324 vo_osd_progbar_value=( ( guiInfo.Volume ) * 256.0 ) / 100.0; |
23077 | 325 vo_osd_changed( OSDTYPE_PROGBAR ); |
326 } | |
327 break; | |
328 | |
329 | |
34458 | 330 case evMenu: |
331 /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Not before mouse over and | |
332 { cursor keys will work there. | |
333 gtkShow( ivHidePopUpMenu,NULL ); | |
334 uiShowMenu( 0,0 ); | |
335 } | |
336 else*/ gtkShow( ivShowPopUpMenu,NULL ); | |
337 break; | |
338 | |
23077 | 339 case evIconify: |
340 switch ( iparam ) | |
341 { | |
33555 | 342 case 0: wsIconify( guiApp.mainWindow ); break; |
343 case 1: wsIconify( guiApp.subWindow ); break; | |
23077 | 344 } |
345 break; | |
346 case evHalfSize: | |
33947 | 347 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 348 { |
33555 | 349 if ( guiApp.subWindow.isFullScreen ) |
23077 | 350 { |
33555 | 351 uiFullScreen(); |
23077 | 352 } |
33901 | 353 wsResizeWindow( &guiApp.subWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2 ); |
33997 | 354 wsMoveWindow( &guiApp.subWindow, False, guiApp.sub.x, guiApp.sub.y ); |
33950 | 355 btnSet( evFullScreen,btnReleased ); |
23077 | 356 } |
357 break; | |
358 case evDoubleSize: | |
33947 | 359 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 360 { |
33555 | 361 if ( guiApp.subWindow.isFullScreen ) |
23077 | 362 { |
33555 | 363 uiFullScreen(); |
23077 | 364 } |
33901 | 365 wsResizeWindow( &guiApp.subWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2 ); |
33998
ca20e4098c1d
Preserve x and y position of a double-size window if possible.
ib
parents:
33997
diff
changeset
|
366 wsMoveWindowWithin( &guiApp.subWindow, False, guiApp.sub.x, guiApp.sub.y ); |
33950 | 367 btnSet( evFullScreen,btnReleased ); |
23077 | 368 } |
369 break; | |
370 case evNormalSize: | |
33947 | 371 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 372 { |
33555 | 373 if ( guiApp.subWindow.isFullScreen ) |
23077 | 374 { |
33555 | 375 uiFullScreen(); |
23077 | 376 } |
33901 | 377 wsResizeWindow( &guiApp.subWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); |
33993 | 378 wsMoveWindow( &guiApp.subWindow, False, guiApp.sub.x, guiApp.sub.y ); |
33947 | 379 btnSet( evFullScreen,btnReleased ); |
23077 | 380 break; |
33555 | 381 } else if ( !guiApp.subWindow.isFullScreen ) break; |
23077 | 382 case evFullScreen: |
33947 | 383 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
384 { | |
33950 | 385 uiFullScreen(); |
386 if ( !guiApp.subWindow.isFullScreen ) | |
387 { | |
388 wsResizeWindow( &guiApp.subWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); | |
33993 | 389 wsMoveWindow( &guiApp.subWindow, False, guiApp.sub.x, guiApp.sub.y ); |
33950 | 390 } |
33947 | 391 } |
33555 | 392 if ( guiApp.subWindow.isFullScreen ) btnSet( evFullScreen,btnPressed ); |
23077 | 393 else btnSet( evFullScreen,btnReleased ); |
394 break; | |
395 | |
396 case evSetAspect: | |
397 switch ( iparam ) | |
398 { | |
399 case 2: movie_aspect=16.0f / 9.0f; break; | |
400 case 3: movie_aspect=4.0f / 3.0f; break; | |
401 case 4: movie_aspect=2.35; break; | |
402 case 1: | |
403 default: movie_aspect=-1; | |
404 } | |
33555 | 405 wsClearWindow( guiApp.subWindow ); |
34456 | 406 if ( guiInfo.StreamType == STREAMTYPE_VCD ) uiEventHandling( evPlayVCD, 0 ); |
407 else if ( guiInfo.StreamType == STREAMTYPE_DVD ) uiEventHandling( ivPlayDVD, 0 ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
408 else |
33890 | 409 guiInfo.NewPlay=GUI_FILE_NEW; |
23077 | 410 break; |
411 | |
412 // --- timer events | |
34333 | 413 case ivRedraw: |
23077 | 414 { |
415 unsigned now = GetTimerMS(); | |
416 if ((now > last_redraw_time) && | |
417 (now < last_redraw_time + GUI_REDRAW_WAIT) && | |
34035 | 418 !uiPlaybarFade && (iparam == 0)) |
23077 | 419 break; |
420 last_redraw_time = now; | |
421 } | |
33555 | 422 uiMainRender=1; |
423 wsPostRedisplay( &guiApp.mainWindow ); | |
424 wsPostRedisplay( &guiApp.playbarWindow ); | |
23077 | 425 break; |
426 // --- system events | |
427 case evNone: | |
34416 | 428 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: evNone\n" ); |
23077 | 429 break; |
430 default: | |
34416 | 431 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: unknown event %d, param %.2f\n", msg, param ); |
23077 | 432 break; |
433 } | |
434 } | |
435 | |
33555 | 436 void uiMainMouseHandle( int Button,int X,int Y,int RX,int RY ) |
23077 | 437 { |
438 static int itemtype = 0; | |
439 int i; | |
440 wItem * item = NULL; | |
441 float value = 0.0f; | |
442 | |
443 static int SelectedItem = -1; | |
444 int currentselected = -1; | |
445 | |
33555 | 446 for ( i=0;i <= guiApp.IndexOfMainItems;i++ ) |
447 if ( ( guiApp.mainItems[i].pressed != btnDisabled )&& | |
448 ( wgIsRect( X,Y,guiApp.mainItems[i].x,guiApp.mainItems[i].y,guiApp.mainItems[i].x+guiApp.mainItems[i].width,guiApp.mainItems[i].y+guiApp.mainItems[i].height ) ) ) | |
23077 | 449 { currentselected=i; break; } |
450 | |
451 switch ( Button ) | |
452 { | |
453 case wsPMMouseButton: | |
34333 | 454 gtkShow( ivHidePopUpMenu,NULL ); |
33555 | 455 uiShowMenu( RX,RY ); |
23077 | 456 itemtype=itPRMButton; |
457 break; | |
458 case wsRMMouseButton: | |
33555 | 459 uiHideMenu( RX,RY,0 ); |
23077 | 460 break; |
461 | |
462 case wsPLMouseButton: | |
34333 | 463 gtkShow( ivHidePopUpMenu,NULL ); |
23077 | 464 sx=X; sy=Y; boxMoved=1; itemtype=itPLMButton; |
465 SelectedItem=currentselected; | |
466 if ( SelectedItem == -1 ) break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
467 boxMoved=0; |
33555 | 468 item=&guiApp.mainItems[SelectedItem]; |
23077 | 469 itemtype=item->type; |
470 item->pressed=btnPressed; | |
471 switch( item->type ) | |
472 { | |
473 case itButton: | |
474 if ( ( SelectedItem > -1 ) && | |
32911 | 475 ( ( ( item->message == evPlaySwitchToPause && item->message == evPauseSwitchToPlay ) ) || |
476 ( ( item->message == evPauseSwitchToPlay && item->message == evPlaySwitchToPause ) ) ) ) | |
23077 | 477 { item->pressed=btnDisabled; } |
478 break; | |
479 } | |
480 break; | |
481 case wsRLMouseButton: | |
482 boxMoved=0; | |
33107 | 483 if ( SelectedItem != -1 ) // NOTE TO MYSELF: only if itButton, itHPotmeter or itVPotmeter |
484 { | |
33555 | 485 item=&guiApp.mainItems[SelectedItem]; |
33108 | 486 item->pressed=btnReleased; |
33107 | 487 } |
23077 | 488 SelectedItem=-1; |
489 if ( currentselected == - 1 ) { itemtype=0; break; } | |
490 value=0; | |
491 switch( itemtype ) | |
492 { | |
493 case itPotmeter: | |
494 case itHPotmeter: | |
32911 | 495 btnModify( item->message,(float)( X - item->x ) / item->width * 100.0f ); |
33555 | 496 uiEventHandling( item->message,item->value ); |
23077 | 497 value=item->value; |
498 break; | |
499 case itVPotmeter: | |
32911 | 500 btnModify( item->message, ( 1. - (float)( Y - item->y ) / item->height) * 100.0f ); |
33555 | 501 uiEventHandling( item->message,item->value ); |
23077 | 502 value=item->value; |
503 break; | |
504 } | |
33555 | 505 uiEventHandling( item->message,value ); |
23077 | 506 itemtype=0; |
507 break; | |
508 | |
509 case wsRRMouseButton: | |
34333 | 510 gtkShow( ivShowPopUpMenu,NULL ); |
23077 | 511 break; |
512 | |
513 // --- rolled mouse ... de szar :))) | |
514 case wsP5MouseButton: value=-2.5f; goto rollerhandled; | |
515 case wsP4MouseButton: value= 2.5f; | |
516 rollerhandled: | |
33555 | 517 item=&guiApp.mainItems[currentselected]; |
23077 | 518 if ( ( item->type == itHPotmeter )||( item->type == itVPotmeter )||( item->type == itPotmeter ) ) |
519 { | |
520 item->value+=value; | |
32911 | 521 btnModify( item->message,item->value ); |
33555 | 522 uiEventHandling( item->message,item->value ); |
23077 | 523 } |
524 break; | |
525 | |
526 // --- moving | |
527 case wsMoveMouse: | |
33555 | 528 item=&guiApp.mainItems[SelectedItem]; |
23077 | 529 switch ( itemtype ) |
530 { | |
531 case itPLMButton: | |
33993 | 532 wsMoveWindow( &guiApp.mainWindow,True,RX - abs( sx ),RY - abs( sy ) ); |
33555 | 533 uiMainRender=0; |
23077 | 534 break; |
535 case itPRMButton: | |
33555 | 536 uiMenuMouseHandle( X,Y,RX,RY ); |
23077 | 537 break; |
538 case itPotmeter: | |
539 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
540 goto potihandled; | |
541 case itVPotmeter: | |
542 item->value=(1. - (float)( Y - item->y ) / item->height) * 100.0f; | |
543 goto potihandled; | |
544 case itHPotmeter: | |
545 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
546 potihandled: | |
547 if ( item->value > 100.0f ) item->value=100.0f; | |
548 if ( item->value < 0.0f ) item->value=0.0f; | |
33555 | 549 uiEventHandling( item->message,item->value ); |
23077 | 550 break; |
551 } | |
552 break; | |
553 } | |
554 } | |
555 | |
556 int keyPressed = 0; | |
557 | |
33555 | 558 void uiMainKeyHandle( int KeyCode,int Type,int Key ) |
23077 | 559 { |
560 int msg = evNone; | |
561 | |
562 if ( Type != wsKeyPressed ) return; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
563 |
23077 | 564 if ( !Key ) |
565 { | |
566 switch ( KeyCode ) | |
567 { | |
33524 | 568 // NOTE TO MYSELF: This is only for the Acer AirKey V keyboard. |
33536
fc1402410163
Remove support for Acer AirKey V keyboard multimedia keys.
ib
parents:
33535
diff
changeset
|
569 /*case wsXFMMPrev: msg=evPrev; break; |
23077 | 570 case wsXFMMStop: msg=evStop; break; |
571 case wsXFMMPlay: msg=evPlaySwitchToPause; break; | |
572 case wsXFMMNext: msg=evNext; break; | |
573 case wsXFMMVolUp: msg=evIncVolume; break; | |
574 case wsXFMMVolDown: msg=evDecVolume; break; | |
33536
fc1402410163
Remove support for Acer AirKey V keyboard multimedia keys.
ib
parents:
33535
diff
changeset
|
575 case wsXFMMMute: msg=evMute; break;*/ |
23077 | 576 } |
577 } | |
578 else | |
579 { | |
580 switch ( Key ) | |
581 { | |
582 case wsEnter: msg=evPlay; break; | |
583 case wsXF86LowerVolume: msg=evDecVolume; break; | |
584 case wsXF86RaiseVolume: msg=evIncVolume; break; | |
585 case wsXF86Mute: msg=evMute; break; | |
33525 | 586 case wsXF86Pause: |
23077 | 587 case wsXF86Play: msg=evPlaySwitchToPause; break; |
588 case wsXF86Stop: msg=evStop; break; | |
589 case wsXF86Prev: msg=evPrev; break; | |
590 case wsXF86Next: msg=evNext; break; | |
591 case wsXF86Media: msg=evLoad; break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
592 case wsEscape: |
33943 | 593 if ( guiInfo.VideoWindow && guiInfo.Playing && guiApp.subWindow.isFullScreen ) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
594 { |
33555 | 595 uiEventHandling( evNormalSize,0 ); |
23077 | 596 return; |
597 } | |
598 default: vo_x11_putkey( Key ); return; | |
599 } | |
600 } | |
33555 | 601 if ( msg != evNone ) uiEventHandling( msg,0 ); |
23077 | 602 } |
603 | |
604 /* this will be used to handle Drag&Drop files */ | |
33555 | 605 void uiDandDHandler(int num,char** files) |
23077 | 606 { |
607 struct stat buf; | |
608 int f = 0; | |
609 | |
610 char* subtitles = NULL; | |
611 char* filename = NULL; | |
612 | |
613 if (num <= 0) | |
614 return; | |
615 | |
616 | |
617 /* now fill it with new items */ | |
618 for(f=0; f < num; f++){ | |
619 char* str = strdup( files[f] ); | |
620 plItem* item; | |
621 | |
24086
f5b32d12b691
remove gconvert_uri_to_filename() and use url_unescape_string() instead.
iive
parents:
23457
diff
changeset
|
622 url_unescape_string(str, files[f]); |
23077 | 623 |
624 if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { | |
625 /* this is not a directory so try to play it */ | |
626 mp_msg( MSGT_GPLAYER,MSGL_V,"Received D&D %s\n",str ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
627 |
23077 | 628 /* check if it is a subtitle file */ |
629 { | |
630 char* ext = strrchr(str,'.'); | |
631 if (ext) { | |
632 static char supported[] = "utf/sub/srt/smi/rt//txt/ssa/aqt/"; | |
633 char* type; | |
634 int len; | |
635 if((len=strlen(++ext)) && (type=strstr(supported,ext)) &&\ | |
636 (type-supported)%4 == 0 && *(type+len) == '/'){ | |
637 /* handle subtitle file */ | |
33739 | 638 nfree(subtitles); |
23077 | 639 subtitles = str; |
640 continue; | |
641 } | |
642 } | |
643 } | |
644 | |
645 /* clear playlist */ | |
646 if (filename == NULL) { | |
647 filename = files[f]; | |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
648 listSet(gtkDelPl,NULL); |
23077 | 649 } |
650 | |
651 item = calloc(1,sizeof(plItem)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
652 |
23077 | 653 /* FIXME: decompose file name ? */ |
654 /* yes -- Pontscho */ | |
655 if ( strrchr( str,'/' ) ) { | |
656 char * s = strrchr( str,'/' ); *s=0; s++; | |
657 item->name = gstrdup( s ); | |
658 item->path = gstrdup( str ); | |
659 } else { | |
660 item->name = strdup(str); | |
661 item->path = strdup(""); | |
662 } | |
33742
e1539e14d60f
Move purely list related parts of gtkSet() from interface.c to list.c.
ib
parents:
33739
diff
changeset
|
663 listSet(gtkAddPlItem,item); |
23077 | 664 } else { |
665 mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_NotAFile,str ); | |
666 } | |
667 free( str ); | |
668 } | |
669 | |
670 if (filename) { | |
33555 | 671 uiSetFileName( NULL,filename,STREAMTYPE_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
672 if ( guiInfo.Playing == GUI_PLAY ) uiEventHandling( evStop,0 ); |
33555 | 673 uiEventHandling( evPlay,0 ); |
23077 | 674 } |
675 if (subtitles) { | |
33897 | 676 nfree(guiInfo.SubtitleFilename); |
677 guiInfo.SubtitleFilename = subtitles; | |
678 mplayerLoadSubtitle(guiInfo.SubtitleFilename); | |
23077 | 679 } |
680 } |