Mercurial > mplayer.hg
annotate gui/mplayer/play.c @ 32847:12ae3b893c59
Remove support for skins directories using the obsolete name 'Skin'.
author | ib |
---|---|
date | Sat, 19 Feb 2011 22:02:34 +0000 |
parents | 8fa2f43cb760 |
children | dd3b365972a4 |
rev | line source |
---|---|
26458 | 1 /* |
2 * This file is part of MPlayer. | |
3 * | |
4 * MPlayer is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * MPlayer is distributed in the hope that it will be useful, | |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 * GNU General Public License for more details. | |
13 * | |
14 * You should have received a copy of the GNU General Public License along | |
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 */ | |
23077 | 18 |
19 #include <inttypes.h> | |
20 #include <stdlib.h> | |
21 #include <stdio.h> | |
22 #include <string.h> | |
23 | |
24 #include <unistd.h> | |
25 #include <signal.h> | |
26 | |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
27 #include "config.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
28 #include "help_mp.h" |
32039
5c708ee9b4ab
Add appropriate #include instead of declaring seek-related variables extern.
diego
parents:
30653
diff
changeset
|
29 #include "mp_core.h" |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
29263
diff
changeset
|
30 #include "libmpcodecs/vd.h" |
26382
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
31 #include "libvo/x11_common.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
32 #include "libvo/video_out.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
33 #include "input/input.h" |
b2f4abcf20ed
Make include paths consistent; do not use ../ in them.
diego
parents:
26365
diff
changeset
|
34 |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
35 #include "gui/wm/ws.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
36 #include "gui/wm/wsxdnd.h" |
23077 | 37 |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
38 #include "gui/app.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
39 #include "gui/wm/wskeys.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
40 #include "gui/interface.h" |
23077 | 41 |
42 #include "widgets.h" | |
43 #include "gmplayer.h" | |
44 #include "play.h" | |
45 | |
26365
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
46 #include "gui/skin/skin.h" |
10dfbc523184
Add gui/ prefix to some #include paths so that compilation from the
diego
parents:
26203
diff
changeset
|
47 #include "gui/skin/font.h" |
23077 | 48 |
49 #include "stream/stream.h" | |
50 | |
51 int mplGotoTheNext = 1; | |
52 | |
53 void mplFullScreen( void ) | |
54 { | |
55 if ( guiIntfStruct.NoWindow && guiIntfStruct.Playing ) return; | |
56 | |
57 if ( ( guiIntfStruct.Playing )&&( appMPlayer.subWindow.isFullScreen ) ) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
58 { |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
59 appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight; |
23077 | 60 switch ( appMPlayer.sub.x ) |
61 { | |
62 case -1: appMPlayer.subWindow.OldX=( wsMaxX / 2 ) - ( appMPlayer.subWindow.OldWidth / 2 ) + wsOrgX; break; | |
63 case -2: appMPlayer.subWindow.OldX=wsMaxX - appMPlayer.subWindow.OldWidth + wsOrgX; break; | |
64 default: appMPlayer.subWindow.OldX=appMPlayer.sub.x; break; | |
65 } | |
66 switch ( appMPlayer.sub.y ) | |
67 { | |
68 case -1: appMPlayer.subWindow.OldY=( wsMaxY / 2 ) - ( appMPlayer.subWindow.OldHeight / 2 ) + wsOrgY; break; | |
69 case -2: appMPlayer.subWindow.OldY=wsMaxY - appMPlayer.subWindow.OldHeight + wsOrgY; break; | |
70 default: appMPlayer.subWindow.OldY=appMPlayer.sub.y; break; | |
71 } | |
72 } | |
73 if ( guiIntfStruct.Playing || gtkShowVideoWindow ) wsFullScreen( &appMPlayer.subWindow ); | |
74 fullscreen=vo_fs=appMPlayer.subWindow.isFullScreen; | |
75 wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen ); | |
76 if ( appMPlayer.menuIsPresent ) wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); | |
77 | |
78 if ( guiIntfStruct.Playing ) wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); | |
79 else wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); | |
80 } | |
81 | |
82 void mplEnd( void ) | |
83 { | |
84 plItem * next; | |
85 | |
86 if ( !mplGotoTheNext && guiIntfStruct.Playing) { mplGotoTheNext=1; return; } | |
87 | |
88 if ( guiIntfStruct.Playing && (next=gtkSet( gtkGetNextPlItem,0,NULL )) && plLastPlayed != next ) | |
89 { | |
90 plLastPlayed=next; | |
91 guiSetDF( guiIntfStruct.Filename,next->path,next->name ); | |
92 guiIntfStruct.StreamType=STREAMTYPE_FILE; | |
93 guiIntfStruct.FilenameChanged=guiIntfStruct.NewPlay=1; | |
94 gfree( (void **)&guiIntfStruct.AudioFile ); | |
95 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
96 } |
23077 | 97 else |
98 { | |
99 if ( guiIntfStruct.FilenameChanged || guiIntfStruct.NewPlay ) return; | |
100 | |
101 guiIntfStruct.TimeSec=0; | |
102 guiIntfStruct.Position=0; | |
103 guiIntfStruct.AudioType=0; | |
104 guiIntfStruct.NoWindow=False; | |
105 | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
106 #ifdef CONFIG_DVDREAD |
23077 | 107 guiIntfStruct.DVD.current_title=1; |
108 guiIntfStruct.DVD.current_chapter=1; | |
109 guiIntfStruct.DVD.current_angle=1; | |
110 #endif | |
111 | |
112 if ( !appMPlayer.subWindow.isFullScreen && gtkShowVideoWindow) | |
113 { | |
114 wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height ); | |
115 wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); | |
116 } | |
117 else wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); | |
118 guiGetEvent( guiCEvent,guiSetStop ); | |
119 mplSubRender=1; | |
120 wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); | |
121 wsClearWindow( appMPlayer.subWindow ); | |
122 wsPostRedisplay( &appMPlayer.subWindow ); | |
123 } | |
124 } | |
125 | |
126 void mplPlay( void ) | |
127 { | |
128 if ( ( !guiIntfStruct.Filename )|| | |
129 ( guiIntfStruct.Filename[0] == 0 )|| | |
130 ( guiIntfStruct.Playing == 1 ) ) return; | |
131 if ( guiIntfStruct.Playing == 2 ) { mplPause(); return; } | |
132 guiGetEvent( guiCEvent,(void *)guiSetPlay ); | |
133 mplSubRender=0; | |
134 wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); | |
135 wsClearWindow( appMPlayer.subWindow ); | |
136 } | |
137 | |
138 void mplPause( void ) | |
139 { | |
140 if ( !guiIntfStruct.Playing ) return; | |
141 if ( guiIntfStruct.Playing == 1 ) | |
142 { | |
143 mp_cmd_t * cmd = calloc( 1,sizeof( *cmd ) ); | |
144 cmd->id=MP_CMD_PAUSE; | |
145 cmd->name=strdup("pause"); | |
146 mp_input_queue_cmd(cmd); | |
147 } else guiIntfStruct.Playing=1; | |
148 } | |
149 | |
150 void mplState( void ) | |
151 { | |
152 if ( ( guiIntfStruct.Playing == 0 )||( guiIntfStruct.Playing == 2 ) ) | |
153 { | |
154 btnModify( evPlaySwitchToPause,btnReleased ); | |
155 btnModify( evPauseSwitchToPlay,btnDisabled ); | |
156 } | |
157 else | |
158 { | |
159 btnModify( evPlaySwitchToPause,btnDisabled ); | |
160 btnModify( evPauseSwitchToPlay,btnReleased ); | |
161 } | |
162 } | |
163 | |
164 float mplGetPosition( void ) | |
165 { // return 0.0 ... 100.0 | |
166 return guiIntfStruct.Position; | |
167 } | |
168 | |
169 void mplRelSeek( float s ) | |
170 { // -+s | |
171 rel_seek_secs=s; abs_seek_pos=0; | |
172 } | |
173 | |
174 void mplAbsSeek( float s ) | |
175 { // 0.0 ... 100.0 | |
176 if ( guiIntfStruct.StreamType == STREAMTYPE_STREAM ) return; | |
177 rel_seek_secs=0.01*s; abs_seek_pos=3; | |
178 } | |
179 | |
180 listItems tmpList; | |
181 | |
182 void ChangeSkin( char * name ) | |
183 { | |
184 int ret; | |
185 int prev = appMPlayer.menuIsPresent; | |
186 int bprev = appMPlayer.barIsPresent; | |
187 | |
188 mainVisible=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
189 |
23077 | 190 appInitStruct( &tmpList ); |
191 skinAppMPlayer=&tmpList; | |
192 fntFreeFont(); | |
193 ret=skinRead( name ); | |
194 | |
195 appInitStruct( &tmpList ); | |
196 skinAppMPlayer=&appMPlayer; | |
197 appInitStruct( &appMPlayer ); | |
198 if ( ret ) name=skinName; | |
199 if ( skinRead( name ) ) | |
200 { | |
201 mainVisible=1; | |
202 return; | |
203 } | |
204 | |
205 // --- reload menu window | |
206 | |
207 if ( prev && appMPlayer.menuIsPresent ) | |
208 { | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32039
diff
changeset
|
209 free( mplMenuDrawBuffer ); |
23077 | 210 if ( ( mplMenuDrawBuffer = calloc( 1,appMPlayer.menuBase.Bitmap.ImageSize ) ) == NULL ) |
211 { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; } | |
212 wsResizeWindow( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height ); | |
213 wsResizeImage( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height ); | |
214 wsSetShape( &appMPlayer.menuWindow,appMPlayer.menuBase.Mask.Image ); | |
215 wsVisibleWindow( &appMPlayer.menuWindow,wsHideWindow ); | |
216 } else { mplMenuInit(); } | |
217 | |
218 // --- reload sub window | |
219 if ( appMPlayer.sub.Bitmap.Image ) wsResizeImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); | |
220 if ( ( !appMPlayer.subWindow.isFullScreen )&&( !guiIntfStruct.Playing ) ) | |
221 { | |
222 wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height ); | |
223 wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); | |
224 } | |
225 if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); | |
226 if ( !guiIntfStruct.Playing ) | |
227 { | |
228 mplSubRender=1; | |
229 wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); | |
230 wsClearWindow( appMPlayer.subWindow ); | |
231 wsPostRedisplay( &appMPlayer.subWindow ); | |
232 } | |
233 | |
234 // --- reload play bar | |
235 if ( bprev ) wsDestroyWindow( &appMPlayer.barWindow ); | |
236 mplPBInit(); | |
237 | |
238 // --- reload main window | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32039
diff
changeset
|
239 free( mplDrawBuffer ); |
23077 | 240 if ( ( mplDrawBuffer = calloc( 1,appMPlayer.main.Bitmap.ImageSize ) ) == NULL ) |
241 { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; } | |
242 | |
243 wsDestroyWindow( &appMPlayer.mainWindow ); | |
244 | |
245 wsCreateWindow( &appMPlayer.mainWindow, | |
246 appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height, | |
247 wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsMaxSize|wsHideWindow,"MPlayer" ); | |
248 wsCreateImage( &appMPlayer.mainWindow,appMPlayer.main.Bitmap.Width,appMPlayer.main.Bitmap.Height ); | |
249 wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); | |
250 wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); | |
251 | |
252 appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; | |
253 appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; | |
254 appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; | |
255 appMPlayer.mainWindow.DandDHandler=mplDandDHandler; | |
256 | |
257 wsXDNDMakeAwareness( &appMPlayer.mainWindow ); | |
258 if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); | |
259 wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow ); | |
260 mainVisible=1; | |
261 // --- | |
262 | |
263 btnModify( evSetVolume,guiIntfStruct.Volume ); | |
264 btnModify( evSetBalance,guiIntfStruct.Balance ); | |
265 btnModify( evSetMoviePosition,guiIntfStruct.Position ); | |
266 btnModify( evFullScreen,!appMPlayer.subWindow.isFullScreen ); | |
267 | |
268 wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen ); | |
269 wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
270 |
23077 | 271 } |
272 | |
273 void mplSetFileName( char * dir,char * name,int type ) | |
274 { | |
275 if ( !name ) return; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
276 |
23077 | 277 if ( !dir ) guiSetFilename( guiIntfStruct.Filename,name ) |
278 else guiSetDF( guiIntfStruct.Filename,dir,name ); | |
279 | |
280 // filename=guiIntfStruct.Filename; | |
281 guiIntfStruct.StreamType=type; | |
282 gfree( (void **)&guiIntfStruct.AudioFile ); | |
283 gfree( (void **)&guiIntfStruct.Subtitlename ); | |
284 } | |
285 | |
286 void mplCurr( void ) | |
287 { | |
288 plItem * curr; | |
289 int stop = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
290 |
23077 | 291 if ( guiIntfStruct.Playing == 2 ) return; |
292 switch ( guiIntfStruct.StreamType ) | |
293 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
294 #ifdef CONFIG_DVDREAD |
23077 | 295 case STREAMTYPE_DVD: |
296 break; | |
297 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
298 #ifdef CONFIG_VCD |
23077 | 299 case STREAMTYPE_VCD: |
300 break; | |
301 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
302 default: |
23077 | 303 if ( (curr=gtkSet( gtkGetCurrPlItem,0,NULL)) ) |
304 { | |
305 mplSetFileName( curr->path,curr->name,STREAMTYPE_FILE ); | |
306 mplGotoTheNext=0; | |
307 break; | |
308 } | |
309 return; | |
310 } | |
311 if ( stop ) mplEventHandling( evStop,0 ); | |
312 if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); | |
313 } | |
314 | |
315 | |
316 void mplPrev( void ) | |
317 { | |
318 plItem * prev; | |
319 int stop = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
320 |
23077 | 321 if ( guiIntfStruct.Playing == 2 ) return; |
322 switch ( guiIntfStruct.StreamType ) | |
323 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
324 #ifdef CONFIG_DVDREAD |
23077 | 325 case STREAMTYPE_DVD: |
326 if ( --guiIntfStruct.DVD.current_chapter == 0 ) | |
327 { | |
328 guiIntfStruct.DVD.current_chapter=1; | |
329 if ( --guiIntfStruct.DVD.current_title <= 0 ) { guiIntfStruct.DVD.current_title=1; stop=1; } | |
330 } | |
331 guiIntfStruct.Track=guiIntfStruct.DVD.current_title; | |
332 break; | |
333 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
334 #ifdef CONFIG_VCD |
23077 | 335 case STREAMTYPE_VCD: |
336 if ( --guiIntfStruct.Track == 0 ) { guiIntfStruct.Track=1; stop=1; } | |
337 break; | |
338 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
339 default: |
23077 | 340 if ( (prev=gtkSet( gtkGetPrevPlItem,0,NULL)) ) |
341 { | |
342 mplSetFileName( prev->path,prev->name,STREAMTYPE_FILE ); | |
343 mplGotoTheNext=0; | |
344 break; | |
345 } | |
346 return; | |
347 } | |
348 if ( stop ) mplEventHandling( evStop,0 ); | |
349 if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); | |
350 } | |
351 | |
352 void mplNext( void ) | |
353 { | |
354 int stop = 0; | |
355 plItem * next; | |
356 | |
357 if ( guiIntfStruct.Playing == 2 ) return; | |
358 switch ( guiIntfStruct.StreamType ) | |
359 { | |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
26458
diff
changeset
|
360 #ifdef CONFIG_DVDREAD |
23077 | 361 case STREAMTYPE_DVD: |
362 if ( guiIntfStruct.DVD.current_chapter++ == guiIntfStruct.DVD.chapters ) | |
363 { | |
364 guiIntfStruct.DVD.current_chapter=1; | |
365 if ( ++guiIntfStruct.DVD.current_title > guiIntfStruct.DVD.titles ) { guiIntfStruct.DVD.current_title=guiIntfStruct.DVD.titles; stop=1; } | |
366 } | |
367 guiIntfStruct.Track=guiIntfStruct.DVD.current_title; | |
368 break; | |
369 #endif | |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
27341
diff
changeset
|
370 #ifdef CONFIG_VCD |
23077 | 371 case STREAMTYPE_VCD: |
372 if ( ++guiIntfStruct.Track > guiIntfStruct.VCDTracks ) { guiIntfStruct.Track=guiIntfStruct.VCDTracks; stop=1; } | |
373 break; | |
374 #endif | |
375 default: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
376 if ( (next=gtkSet( gtkGetNextPlItem,0,NULL)) ) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27370
diff
changeset
|
377 { |
23077 | 378 mplSetFileName( next->path,next->name,STREAMTYPE_FILE ); |
379 mplGotoTheNext=0; | |
380 break; | |
381 } | |
382 return; | |
383 } | |
384 if ( stop ) mplEventHandling( evStop,0 ); | |
385 if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); | |
386 } |