Mercurial > mplayer.hg
annotate gui/ui/main.c @ 35349:60930e7347c6
Add an URL loaded by the GUI to its playlist.
Additionally, allow URLs to be in the playlist.
The GUI operates on its playlist, so the URL may not be missing there.
For further information see r35442.
author | ib |
---|---|
date | Thu, 22 Nov 2012 13:13:29 +0000 |
parents | 203d0d5cac1f |
children | 92f6fc87ddc8 |
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 |
34699
ed0e00db4306
Cosmetic: Move, change and add some comments on GUI windows.
ib
parents:
34697
diff
changeset
|
19 /* main window */ |
ed0e00db4306
Cosmetic: Move, change and add some comments on GUI windows.
ib
parents:
34697
diff
changeset
|
20 |
23077 | 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); | |
34663 | 114 listMgr(PLAYLIST_DELETE, 0); |
33771
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 { | |
34684 | 138 /* user events */ |
23077 | 139 case evExit: |
33768 | 140 mplayer( MPLAYER_EXIT_GUI, EXIT_QUIT, 0 ); |
23077 | 141 break; |
142 | |
34324 | 143 case evLoadURL: |
35349 | 144 listMgr( PLAYLIST_DELETE,0 ); |
34329 | 145 gtkShow( evLoadURL,NULL ); |
23077 | 146 break; |
147 | |
34333 | 148 case ivSetAudio: |
33657 | 149 if ( !mpctx_get_demuxer(guiInfo.mpcontext) || audio_id == iparam ) break; |
34469 | 150 mp_property_do("switch_audio",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); |
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); |
156 break; | |
23077 | 157 |
34333 | 158 case ivSetSubtitle: |
33555 | 159 mp_property_do("sub",M_PROPERTY_SET,&iparam,guiInfo.mpcontext); |
23077 | 160 break; |
161 | |
34387 | 162 #ifdef CONFIG_CDDA |
163 case ivSetCDTrack: | |
164 guiInfo.Track=iparam; | |
165 case evPlayCD: | |
166 guiInfoMediumClear ( CLEAR_ALL ); | |
167 guiInfo.StreamType=STREAMTYPE_CDDA; | |
168 goto play; | |
169 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
170 #ifdef CONFIG_VCD |
34333 | 171 case ivSetVCDTrack: |
33555 | 172 guiInfo.Track=iparam; |
23077 | 173 case evPlayVCD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
174 guiInfoMediumClear ( CLEAR_ALL ); |
33555 | 175 guiInfo.StreamType=STREAMTYPE_VCD; |
23077 | 176 goto play; |
177 #endif | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
178 #ifdef CONFIG_DVDREAD |
34417 | 179 case ivSetDVDSubtitle: |
180 dvdsub_id=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
181 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 182 break; |
183 case ivSetDVDAudio: | |
184 audio_id=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
185 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 186 break; |
187 case ivSetDVDChapter: | |
188 guiInfo.Chapter=iparam; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
189 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 190 break; |
191 case ivSetDVDTitle: | |
192 guiInfo.Track=iparam; | |
193 guiInfo.Chapter=1; | |
194 guiInfo.Angle=1; | |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
195 uiEventHandling( ivPlayDVD, 0 ); |
34417 | 196 break; |
23077 | 197 case evPlayDVD: |
33876
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
198 guiInfo.Track=1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
199 guiInfo.Chapter=1; |
4789b8eed97e
Get rid of a bunch of needless or redundant guiInfo members.
ib
parents:
33874
diff
changeset
|
200 guiInfo.Angle=1; |
34455
00cf27b14c15
Replace goto label by an internal event case expression.
ib
parents:
34454
diff
changeset
|
201 case ivPlayDVD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
202 guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD ); |
33555 | 203 guiInfo.StreamType=STREAMTYPE_DVD; |
23077 | 204 goto play; |
205 #endif | |
206 case evPlay: | |
207 case evPlaySwitchToPause: | |
208 play: | |
209 | |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
210 if ( ( msg == evPlaySwitchToPause )&&( guiInfo.Playing == GUI_PAUSE ) ) goto NoPause; |
23077 | 211 |
35349 | 212 if ( listMgr( PLAYLIST_ITEM_GET_CURR,0 ) &&( guiInfo.StreamType == STREAMTYPE_FILE || guiInfo.StreamType == STREAMTYPE_STREAM ) ) |
23077 | 213 { |
34663 | 214 plItem * next = listMgr( PLAYLIST_ITEM_GET_CURR,0 ); |
34399
f2c03009068d
Don't explicitly set stream type if the type doesn't change.
ib
parents:
34387
diff
changeset
|
215 uiSetFileName( next->path,next->name,SAME_STREAMTYPE ); |
23077 | 216 } |
217 | |
33555 | 218 switch ( guiInfo.StreamType ) |
23077 | 219 { |
34077 | 220 case STREAMTYPE_FILE: |
23077 | 221 case STREAMTYPE_STREAM: |
34859 | 222 case STREAMTYPE_PLAYLIST: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
223 guiInfoMediumClear( CLEAR_ALL - CLEAR_FILE ); |
33898 | 224 if ( !guiInfo.Track ) |
225 guiInfo.Track=1; | |
33890 | 226 guiInfo.NewPlay=GUI_FILE_NEW; |
23077 | 227 break; |
34454 | 228 |
34387 | 229 case STREAMTYPE_CDDA: |
230 guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); | |
231 if ( guiInfo.Playing != GUI_PAUSE ) | |
232 { | |
233 if ( !guiInfo.Track ) | |
234 guiInfo.Track=1; | |
235 guiInfo.NewPlay=GUI_FILE_SAME; | |
236 } | |
237 break; | |
34454 | 238 |
23077 | 239 case STREAMTYPE_VCD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
240 guiInfoMediumClear( CLEAR_ALL - CLEAR_VCD - CLEAR_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
241 if ( guiInfo.Playing != GUI_PAUSE ) |
23077 | 242 { |
33555 | 243 if ( !guiInfo.Track ) |
33874 | 244 guiInfo.Track=2; |
33890 | 245 guiInfo.NewPlay=GUI_FILE_SAME; |
23077 | 246 } |
247 break; | |
34454 | 248 |
23077 | 249 case STREAMTYPE_DVD: |
33771
6e774a02d00c
Remove gtkClearStruct code from mplayer() in interface.c.
ib
parents:
33768
diff
changeset
|
250 guiInfoMediumClear( CLEAR_ALL - CLEAR_DVD - CLEAR_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
251 if ( guiInfo.Playing != GUI_PAUSE ) |
23077 | 252 { |
33890 | 253 guiInfo.NewPlay=GUI_FILE_SAME; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
254 } |
23077 | 255 break; |
256 } | |
33555 | 257 uiPlay(); |
23077 | 258 break; |
259 | |
260 case evPause: | |
261 case evPauseSwitchToPlay: | |
262 NoPause: | |
33555 | 263 uiPause(); |
23077 | 264 break; |
265 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
266 case evStop: |
33614 | 267 guiInfo.Playing=GUI_STOP; |
33555 | 268 uiState(); |
23077 | 269 break; |
270 | |
271 case evLoadPlay: | |
33555 | 272 uiMainAutoPlay=1; |
273 // guiInfo.StreamType=STREAMTYPE_FILE; | |
23077 | 274 case evLoad: |
34663 | 275 listMgr( PLAYLIST_DELETE,0 ); |
23077 | 276 gtkShow( evLoad,NULL ); |
277 break; | |
278 case evLoadSubtitle: gtkShow( evLoadSubtitle,NULL ); break; | |
279 case evDropSubtitle: | |
33897 | 280 nfree( guiInfo.SubtitleFilename ); |
33763 | 281 mplayerLoadSubtitle( NULL ); |
23077 | 282 break; |
283 case evLoadAudioFile: gtkShow( evLoadAudioFile,NULL ); break; | |
33555 | 284 case evPrev: uiPrev(); break; |
285 case evNext: uiNext(); break; | |
23077 | 286 |
34321
daebf766dea6
Cosmetic: Synchronize evPlaylist event and message names.
ib
parents:
34174
diff
changeset
|
287 case evPlaylist: gtkShow( evPlaylist,NULL ); break; |
23077 | 288 case evSkinBrowser: gtkShow( evSkinBrowser,skinName ); break; |
289 case evAbout: gtkShow( evAbout,NULL ); break; | |
290 case evPreferences: gtkShow( evPreferences,NULL ); break; | |
291 case evEqualizer: gtkShow( evEqualizer,NULL ); break; | |
292 | |
33555 | 293 case evForward10min: uiRelSeek( 600 ); break; |
294 case evBackward10min: uiRelSeek( -600 );break; | |
295 case evForward1min: uiRelSeek( 60 ); break; | |
296 case evBackward1min: uiRelSeek( -60 ); break; | |
297 case evForward10sec: uiRelSeek( 10 ); break; | |
298 case evBackward10sec: uiRelSeek( -10 ); break; | |
299 case evSetMoviePosition: uiAbsSeek( param ); break; | |
23077 | 300 |
301 case evIncVolume: vo_x11_putkey( wsGrayMul ); break; | |
302 case evDecVolume: vo_x11_putkey( wsGrayDiv ); break; | |
303 case evMute: mixer_mute( mixer ); break; | |
304 | |
305 case evSetVolume: | |
33555 | 306 guiInfo.Volume=param; |
23077 | 307 goto set_volume; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
308 case evSetBalance: |
33555 | 309 guiInfo.Balance=param; |
23077 | 310 set_volume: |
311 { | |
33555 | 312 float l = guiInfo.Volume * ( ( 100.0 - guiInfo.Balance ) / 50.0 ); |
313 float r = guiInfo.Volume * ( ( guiInfo.Balance ) / 50.0 ); | |
314 if ( l > guiInfo.Volume ) l=guiInfo.Volume; | |
315 if ( r > guiInfo.Volume ) r=guiInfo.Volume; | |
316 // printf( "!!! v: %.2f b: %.2f -> %.2f x %.2f\n",guiInfo.Volume,guiInfo.Balance,l,r ); | |
23077 | 317 mixer_setvolume( mixer,l,r ); |
318 } | |
319 if ( osd_level ) | |
320 { | |
321 osd_visible=(GetTimerMS() + 1000) | 1; | |
322 vo_osd_progbar_type=OSD_VOLUME; | |
33555 | 323 vo_osd_progbar_value=( ( guiInfo.Volume ) * 256.0 ) / 100.0; |
23077 | 324 vo_osd_changed( OSDTYPE_PROGBAR ); |
325 } | |
326 break; | |
327 | |
328 | |
34458 | 329 case evMenu: |
34473 | 330 /*if (guiApp.menuIsPresent) NOTE TO MYSELF: Uncomment only after mouse |
331 { pointer and cursor keys work | |
332 gtkShow( ivHidePopUpMenu,NULL ); with this menu from skin as | |
333 uiShowMenu( 0,0 ); they do with normal menus. | |
34458 | 334 } |
335 else*/ gtkShow( ivShowPopUpMenu,NULL ); | |
336 break; | |
337 | |
23077 | 338 case evIconify: |
339 switch ( iparam ) | |
340 { | |
33555 | 341 case 0: wsIconify( guiApp.mainWindow ); break; |
34697 | 342 case 1: wsIconify( guiApp.videoWindow ); break; |
23077 | 343 } |
344 break; | |
345 case evHalfSize: | |
33947 | 346 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 347 { |
34697 | 348 if ( guiApp.videoWindow.isFullScreen ) |
23077 | 349 { |
33555 | 350 uiFullScreen(); |
23077 | 351 } |
34697 | 352 wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth / 2, guiInfo.VideoHeight / 2 ); |
353 wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); | |
33950 | 354 btnSet( evFullScreen,btnReleased ); |
23077 | 355 } |
356 break; | |
357 case evDoubleSize: | |
33947 | 358 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 359 { |
34697 | 360 if ( guiApp.videoWindow.isFullScreen ) |
23077 | 361 { |
33555 | 362 uiFullScreen(); |
23077 | 363 } |
34697 | 364 wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth * 2, guiInfo.VideoHeight * 2 ); |
365 wsMoveWindowWithin( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); | |
33950 | 366 btnSet( evFullScreen,btnReleased ); |
23077 | 367 } |
368 break; | |
369 case evNormalSize: | |
33947 | 370 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
23077 | 371 { |
34697 | 372 if ( guiApp.videoWindow.isFullScreen ) |
23077 | 373 { |
33555 | 374 uiFullScreen(); |
23077 | 375 } |
34697 | 376 wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); |
377 wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); | |
33947 | 378 btnSet( evFullScreen,btnReleased ); |
23077 | 379 break; |
34697 | 380 } else if ( !guiApp.videoWindow.isFullScreen ) break; |
23077 | 381 case evFullScreen: |
33947 | 382 if ( guiInfo.VideoWindow && guiInfo.Playing ) |
383 { | |
33950 | 384 uiFullScreen(); |
34697 | 385 if ( !guiApp.videoWindow.isFullScreen ) |
33950 | 386 { |
34697 | 387 wsResizeWindow( &guiApp.videoWindow, guiInfo.VideoWidth, guiInfo.VideoHeight ); |
388 wsMoveWindow( &guiApp.videoWindow, False, guiApp.video.x, guiApp.video.y ); | |
33950 | 389 } |
33947 | 390 } |
34697 | 391 if ( guiApp.videoWindow.isFullScreen ) btnSet( evFullScreen,btnPressed ); |
23077 | 392 else btnSet( evFullScreen,btnReleased ); |
393 break; | |
394 | |
395 case evSetAspect: | |
396 switch ( iparam ) | |
397 { | |
398 case 2: movie_aspect=16.0f / 9.0f; break; | |
399 case 3: movie_aspect=4.0f / 3.0f; break; | |
400 case 4: movie_aspect=2.35; break; | |
401 case 1: | |
402 default: movie_aspect=-1; | |
403 } | |
34697 | 404 wsClearWindow( guiApp.videoWindow ); |
34456 | 405 if ( guiInfo.StreamType == STREAMTYPE_VCD ) uiEventHandling( evPlayVCD, 0 ); |
406 else if ( guiInfo.StreamType == STREAMTYPE_DVD ) uiEventHandling( ivPlayDVD, 0 ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
407 else |
33890 | 408 guiInfo.NewPlay=GUI_FILE_NEW; |
23077 | 409 break; |
410 | |
34684 | 411 /* timer events */ |
34333 | 412 case ivRedraw: |
23077 | 413 { |
414 unsigned now = GetTimerMS(); | |
415 if ((now > last_redraw_time) && | |
416 (now < last_redraw_time + GUI_REDRAW_WAIT) && | |
34035 | 417 !uiPlaybarFade && (iparam == 0)) |
23077 | 418 break; |
419 last_redraw_time = now; | |
420 } | |
33555 | 421 uiMainRender=1; |
422 wsPostRedisplay( &guiApp.mainWindow ); | |
423 wsPostRedisplay( &guiApp.playbarWindow ); | |
23077 | 424 break; |
34684 | 425 /* system events */ |
23077 | 426 case evNone: |
34416 | 427 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: evNone\n" ); |
23077 | 428 break; |
429 default: | |
34416 | 430 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[main] uiEventHandling: unknown event %d, param %.2f\n", msg, param ); |
23077 | 431 break; |
432 } | |
433 } | |
434 | |
33555 | 435 void uiMainMouseHandle( int Button,int X,int Y,int RX,int RY ) |
23077 | 436 { |
437 static int itemtype = 0; | |
438 int i; | |
439 wItem * item = NULL; | |
440 float value = 0.0f; | |
441 | |
442 static int SelectedItem = -1; | |
443 int currentselected = -1; | |
444 | |
33555 | 445 for ( i=0;i <= guiApp.IndexOfMainItems;i++ ) |
446 if ( ( guiApp.mainItems[i].pressed != btnDisabled )&& | |
447 ( 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 | 448 { currentselected=i; break; } |
449 | |
450 switch ( Button ) | |
451 { | |
452 case wsPMMouseButton: | |
34333 | 453 gtkShow( ivHidePopUpMenu,NULL ); |
33555 | 454 uiShowMenu( RX,RY ); |
23077 | 455 itemtype=itPRMButton; |
456 break; | |
457 case wsRMMouseButton: | |
33555 | 458 uiHideMenu( RX,RY,0 ); |
23077 | 459 break; |
460 | |
461 case wsPLMouseButton: | |
34333 | 462 gtkShow( ivHidePopUpMenu,NULL ); |
23077 | 463 sx=X; sy=Y; boxMoved=1; itemtype=itPLMButton; |
464 SelectedItem=currentselected; | |
465 if ( SelectedItem == -1 ) break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
466 boxMoved=0; |
33555 | 467 item=&guiApp.mainItems[SelectedItem]; |
23077 | 468 itemtype=item->type; |
469 item->pressed=btnPressed; | |
470 switch( item->type ) | |
471 { | |
472 case itButton: | |
473 if ( ( SelectedItem > -1 ) && | |
32911 | 474 ( ( ( item->message == evPlaySwitchToPause && item->message == evPauseSwitchToPlay ) ) || |
475 ( ( item->message == evPauseSwitchToPlay && item->message == evPlaySwitchToPause ) ) ) ) | |
23077 | 476 { item->pressed=btnDisabled; } |
477 break; | |
478 } | |
479 break; | |
480 case wsRLMouseButton: | |
481 boxMoved=0; | |
33107 | 482 if ( SelectedItem != -1 ) // NOTE TO MYSELF: only if itButton, itHPotmeter or itVPotmeter |
483 { | |
33555 | 484 item=&guiApp.mainItems[SelectedItem]; |
33108 | 485 item->pressed=btnReleased; |
33107 | 486 } |
23077 | 487 SelectedItem=-1; |
488 if ( currentselected == - 1 ) { itemtype=0; break; } | |
489 value=0; | |
490 switch( itemtype ) | |
491 { | |
492 case itPotmeter: | |
493 case itHPotmeter: | |
32911 | 494 btnModify( item->message,(float)( X - item->x ) / item->width * 100.0f ); |
33555 | 495 uiEventHandling( item->message,item->value ); |
23077 | 496 value=item->value; |
497 break; | |
498 case itVPotmeter: | |
32911 | 499 btnModify( item->message, ( 1. - (float)( Y - item->y ) / item->height) * 100.0f ); |
33555 | 500 uiEventHandling( item->message,item->value ); |
23077 | 501 value=item->value; |
502 break; | |
503 } | |
33555 | 504 uiEventHandling( item->message,value ); |
23077 | 505 itemtype=0; |
506 break; | |
507 | |
508 case wsRRMouseButton: | |
34333 | 509 gtkShow( ivShowPopUpMenu,NULL ); |
23077 | 510 break; |
511 | |
34684 | 512 /* rolled mouse ... de szar :))) */ |
23077 | 513 case wsP5MouseButton: value=-2.5f; goto rollerhandled; |
514 case wsP4MouseButton: value= 2.5f; | |
515 rollerhandled: | |
33555 | 516 item=&guiApp.mainItems[currentselected]; |
23077 | 517 if ( ( item->type == itHPotmeter )||( item->type == itVPotmeter )||( item->type == itPotmeter ) ) |
518 { | |
519 item->value+=value; | |
32911 | 520 btnModify( item->message,item->value ); |
33555 | 521 uiEventHandling( item->message,item->value ); |
23077 | 522 } |
523 break; | |
524 | |
34684 | 525 /* moving */ |
23077 | 526 case wsMoveMouse: |
33555 | 527 item=&guiApp.mainItems[SelectedItem]; |
23077 | 528 switch ( itemtype ) |
529 { | |
530 case itPLMButton: | |
33993 | 531 wsMoveWindow( &guiApp.mainWindow,True,RX - abs( sx ),RY - abs( sy ) ); |
33555 | 532 uiMainRender=0; |
23077 | 533 break; |
534 case itPRMButton: | |
34472 | 535 uiMenuMouseHandle( RX,RY ); |
23077 | 536 break; |
537 case itPotmeter: | |
538 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
539 goto potihandled; | |
540 case itVPotmeter: | |
541 item->value=(1. - (float)( Y - item->y ) / item->height) * 100.0f; | |
542 goto potihandled; | |
543 case itHPotmeter: | |
544 item->value=(float)( X - item->x ) / item->width * 100.0f; | |
545 potihandled: | |
546 if ( item->value > 100.0f ) item->value=100.0f; | |
547 if ( item->value < 0.0f ) item->value=0.0f; | |
33555 | 548 uiEventHandling( item->message,item->value ); |
23077 | 549 break; |
550 } | |
551 break; | |
552 } | |
553 } | |
554 | |
555 int keyPressed = 0; | |
556 | |
33555 | 557 void uiMainKeyHandle( int KeyCode,int Type,int Key ) |
23077 | 558 { |
559 int msg = evNone; | |
560 | |
561 if ( Type != wsKeyPressed ) return; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
562 |
23077 | 563 if ( !Key ) |
564 { | |
565 switch ( KeyCode ) | |
566 { | |
33524 | 567 // 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
|
568 /*case wsXFMMPrev: msg=evPrev; break; |
23077 | 569 case wsXFMMStop: msg=evStop; break; |
570 case wsXFMMPlay: msg=evPlaySwitchToPause; break; | |
571 case wsXFMMNext: msg=evNext; break; | |
572 case wsXFMMVolUp: msg=evIncVolume; break; | |
573 case wsXFMMVolDown: msg=evDecVolume; break; | |
33536
fc1402410163
Remove support for Acer AirKey V keyboard multimedia keys.
ib
parents:
33535
diff
changeset
|
574 case wsXFMMMute: msg=evMute; break;*/ |
23077 | 575 } |
576 } | |
577 else | |
578 { | |
579 switch ( Key ) | |
580 { | |
581 case wsEnter: msg=evPlay; break; | |
582 case wsXF86LowerVolume: msg=evDecVolume; break; | |
583 case wsXF86RaiseVolume: msg=evIncVolume; break; | |
584 case wsXF86Mute: msg=evMute; break; | |
33525 | 585 case wsXF86Pause: |
23077 | 586 case wsXF86Play: msg=evPlaySwitchToPause; break; |
587 case wsXF86Stop: msg=evStop; break; | |
588 case wsXF86Prev: msg=evPrev; break; | |
589 case wsXF86Next: msg=evNext; break; | |
590 case wsXF86Media: msg=evLoad; break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
591 case wsEscape: |
34697 | 592 if ( guiInfo.VideoWindow && guiInfo.Playing && guiApp.videoWindow.isFullScreen ) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
593 { |
33555 | 594 uiEventHandling( evNormalSize,0 ); |
23077 | 595 return; |
596 } | |
597 default: vo_x11_putkey( Key ); return; | |
598 } | |
599 } | |
33555 | 600 if ( msg != evNone ) uiEventHandling( msg,0 ); |
23077 | 601 } |
602 | |
603 /* this will be used to handle Drag&Drop files */ | |
33555 | 604 void uiDandDHandler(int num,char** files) |
23077 | 605 { |
606 struct stat buf; | |
607 int f = 0; | |
608 | |
609 char* subtitles = NULL; | |
610 char* filename = NULL; | |
611 | |
612 if (num <= 0) | |
613 return; | |
614 | |
615 | |
616 /* now fill it with new items */ | |
617 for(f=0; f < num; f++){ | |
618 char* str = strdup( files[f] ); | |
619 plItem* item; | |
620 | |
24086
f5b32d12b691
remove gconvert_uri_to_filename() and use url_unescape_string() instead.
iive
parents:
23457
diff
changeset
|
621 url_unescape_string(str, files[f]); |
23077 | 622 |
623 if(stat(str,&buf) == 0 && S_ISDIR(buf.st_mode) == 0) { | |
624 /* this is not a directory so try to play it */ | |
625 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
|
626 |
23077 | 627 /* check if it is a subtitle file */ |
628 { | |
629 char* ext = strrchr(str,'.'); | |
630 if (ext) { | |
631 static char supported[] = "utf/sub/srt/smi/rt//txt/ssa/aqt/"; | |
632 char* type; | |
633 int len; | |
634 if((len=strlen(++ext)) && (type=strstr(supported,ext)) &&\ | |
635 (type-supported)%4 == 0 && *(type+len) == '/'){ | |
636 /* handle subtitle file */ | |
33739 | 637 nfree(subtitles); |
23077 | 638 subtitles = str; |
639 continue; | |
640 } | |
641 } | |
642 } | |
643 | |
644 /* clear playlist */ | |
645 if (filename == NULL) { | |
646 filename = files[f]; | |
34663 | 647 listMgr(PLAYLIST_DELETE,0); |
23077 | 648 } |
649 | |
650 item = calloc(1,sizeof(plItem)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
651 |
23077 | 652 /* FIXME: decompose file name ? */ |
653 /* yes -- Pontscho */ | |
654 if ( strrchr( str,'/' ) ) { | |
655 char * s = strrchr( str,'/' ); *s=0; s++; | |
656 item->name = gstrdup( s ); | |
657 item->path = gstrdup( str ); | |
658 } else { | |
659 item->name = strdup(str); | |
660 item->path = strdup(""); | |
661 } | |
34681 | 662 listMgr(PLAYLIST_ITEM_APPEND,item); |
23077 | 663 } else { |
664 mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_NotAFile,str ); | |
665 } | |
666 free( str ); | |
667 } | |
668 | |
669 if (filename) { | |
33555 | 670 uiSetFileName( NULL,filename,STREAMTYPE_FILE ); |
33615
1f9a31d4f114
Replace all playback integer constants by their symbolic constants.
ib
parents:
33614
diff
changeset
|
671 if ( guiInfo.Playing == GUI_PLAY ) uiEventHandling( evStop,0 ); |
33555 | 672 uiEventHandling( evPlay,0 ); |
23077 | 673 } |
674 if (subtitles) { | |
33897 | 675 nfree(guiInfo.SubtitleFilename); |
676 guiInfo.SubtitleFilename = subtitles; | |
677 mplayerLoadSubtitle(guiInfo.SubtitleFilename); | |
23077 | 678 } |
679 } |