Mercurial > mplayer.hg
annotate libvo/vo_macosx.m @ 28041:211c23dac000
Treat audio output objects the same as everything else in the build system,
i.e. have lines that conditionally enable each in the Makefile and
corresponding variables set from configure.
author | diego |
---|---|
date | Wed, 03 Dec 2008 12:05:47 +0000 |
parents | 3b8e66828e10 |
children | 9e739bdb049c |
rev | line source |
---|---|
15289 | 1 /* |
2 vo_macosx.m | |
3 by Nicolas Plourde <nicolasplourde@gmail.com> | |
4 | |
5 MPlayer Mac OSX video out module. | |
6 Copyright (c) Nicolas Plourde - 2005 | |
7 */ | |
8 | |
9 #import "vo_macosx.h" | |
16385 | 10 #include <sys/types.h> |
11 #include <sys/ipc.h> | |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
12 #include <sys/mman.h> |
27988 | 13 #include <CoreServices/CoreServices.h> |
14 //special workaround for Apple bug #6267445 | |
15 //(OSServices Power API disabled in OSServices.h for 64bit systems) | |
16 #ifndef __POWER__ | |
17 #include <CoreServices/../Frameworks/OSServices.framework/Headers/Power.h> | |
18 #endif | |
15289 | 19 |
20 //MPLAYER | |
21 #include "config.h" | |
22 #include "fastmemcpy.h" | |
23 #include "video_out.h" | |
24 #include "video_out_internal.h" | |
25 #include "aspect.h" | |
26 #include "mp_msg.h" | |
27 #include "m_option.h" | |
28 | |
29 #include "input/input.h" | |
30 #include "input/mouse.h" | |
31 | |
32 #include "osdep/keycodes.h" | |
33 | |
34 //Cocoa | |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
35 NSDistantObject *mplayerosxProxy; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
36 id <MPlayerOSXVOProto> mplayerosxProto; |
15611 | 37 MPlayerOpenGLView *mpGLView; |
15289 | 38 NSAutoreleasePool *autoreleasepool; |
39 OSType pixelFormat; | |
40 | |
16385 | 41 //shared memory |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
42 int shm_fd; |
16385 | 43 BOOL shared_buffer = false; |
44 | |
15728 | 45 //Screen |
46 int screen_id; | |
47 BOOL screen_force; | |
48 NSRect screen_frame; | |
49 NSScreen *screen_handle; | |
50 NSArray *screen_array; | |
15289 | 51 |
52 //image | |
53 unsigned char *image_data; | |
25180 | 54 // For double buffering |
55 static uint8_t image_page = 0; | |
56 static unsigned char *image_datas[2]; | |
57 | |
15289 | 58 static uint32_t image_width; |
59 static uint32_t image_height; | |
60 static uint32_t image_depth; | |
61 static uint32_t image_bytes; | |
62 static uint32_t image_format; | |
63 | |
64 //vo | |
65 static int isFullscreen; | |
15320 | 66 static int isOntop; |
15327 | 67 static int isRootwin; |
15289 | 68 extern float monitor_aspect; |
69 extern float movie_aspect; | |
70 static float old_movie_aspect; | |
25446 | 71 extern int enable_mouse_movements; |
15289 | 72 |
15731 | 73 static float winAlpha = 1; |
15289 | 74 static int int_pause = 0; |
75 | |
25179
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
76 static BOOL isLeopardOrLater; |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
77 |
15289 | 78 static vo_info_t info = |
79 { | |
80 "Mac OSX Core Video", | |
81 "macosx", | |
82 "Nicolas Plourde <nicolas.plourde@gmail.com>", | |
83 "" | |
84 }; | |
85 | |
86 LIBVO_EXTERN(macosx) | |
87 | |
88 extern void mplayer_put_key(int code); | |
89 extern void vo_draw_text(int dxs,int dys,void (*draw_alpha)(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride)); | |
90 | |
91 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, unsigned char *srca, int stride) | |
92 { | |
93 switch (image_format) | |
94 { | |
95 case IMGFMT_RGB32: | |
96 vo_draw_alpha_rgb32(w,h,src,srca,stride,image_data+4*(y0*image_width+x0),4*image_width); | |
97 break; | |
98 case IMGFMT_YUY2: | |
99 vo_draw_alpha_yuy2(w,h,src,srca,stride,image_data + (x0 + y0 * image_width) * 2,image_width*2); | |
100 break; | |
101 } | |
102 } | |
103 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
104 static int config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t flags, char *title, uint32_t format) |
15289 | 105 { |
16385 | 106 |
15728 | 107 //init screen |
108 screen_array = [NSScreen screens]; | |
109 if(screen_id < [screen_array count]) | |
15289 | 110 { |
15728 | 111 screen_handle = [screen_array objectAtIndex:screen_id]; |
15289 | 112 } |
15728 | 113 else |
114 { | |
115 mp_msg(MSGT_VO, MSGL_FATAL, "Get device error: Device ID %d do not exist, falling back to main device.\n", screen_id); | |
116 screen_handle = [screen_array objectAtIndex:0]; | |
117 screen_id = 0; | |
118 } | |
119 screen_frame = [screen_handle frame]; | |
25414
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
120 vo_screenwidth = screen_frame.size.width; |
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
121 vo_screenheight = screen_frame.size.height; |
16385 | 122 |
15289 | 123 //misc mplayer setup |
124 image_width = width; | |
125 image_height = height; | |
126 switch (image_format) | |
127 { | |
128 case IMGFMT_BGR32: | |
129 case IMGFMT_RGB32: | |
130 image_depth = 32; | |
131 break; | |
16385 | 132 case IMGFMT_YUY2: |
15289 | 133 image_depth = 16; |
134 break; | |
135 } | |
136 image_bytes = (image_depth + 7) / 8; | |
16385 | 137 |
138 if(!shared_buffer) | |
139 { | |
25120
9b4ca4dc1294
Fix a memory leak when working in shared_buffer mode.
ulion
parents:
25114
diff
changeset
|
140 image_data = malloc(image_width*image_height*image_bytes); |
25180 | 141 image_datas[0] = image_data; |
142 if (vo_doublebuffering) | |
143 image_datas[1] = malloc(image_width*image_height*image_bytes); | |
144 image_page = 0; | |
25120
9b4ca4dc1294
Fix a memory leak when working in shared_buffer mode.
ulion
parents:
25114
diff
changeset
|
145 |
16385 | 146 monitor_aspect = (float)screen_frame.size.width/(float)screen_frame.size.height; |
147 | |
148 //set aspect | |
149 panscan_init(); | |
150 aspect_save_orig(width,height); | |
151 aspect_save_prescale(d_width,d_height); | |
152 aspect_save_screenres(screen_frame.size.width, screen_frame.size.height); | |
153 aspect((int *)&d_width,(int *)&d_height,A_NOZOOM); | |
154 | |
155 movie_aspect = (float)d_width/(float)d_height; | |
156 old_movie_aspect = movie_aspect; | |
15726 | 157 |
16385 | 158 vo_fs = flags & VOFLAG_FULLSCREEN; |
159 | |
160 //config OpenGL View | |
161 [mpGLView config]; | |
162 [mpGLView reshape]; | |
163 } | |
164 else | |
165 { | |
166 movie_aspect = (float)d_width/(float)d_height; | |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
167 |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
168 // create shared memory |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
169 shm_fd = shm_open("mplayerosx", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
170 if (shm_fd == -1) |
16385 | 171 { |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
172 mp_msg(MSGT_VO, MSGL_FATAL, |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
173 "vo_macosx: failed to open shared memory. Error: %s\n", strerror(errno)); |
16385 | 174 return 1; |
175 } | |
176 | |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
177 |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
178 if (ftruncate(shm_fd, image_width*image_height*image_bytes) == -1) |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
179 { |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
180 mp_msg(MSGT_VO, MSGL_FATAL, |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
181 "vo_macosx: failed to size shared memory, possibly already in use. Error: %s\n", strerror(errno)); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
182 shm_unlink("mplayerosx"); |
16385 | 183 return 1; |
184 } | |
185 | |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
186 image_data = mmap(NULL, image_width*image_height*image_bytes, |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
187 PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
188 |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
189 if (image_data == MAP_FAILED) |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
190 { |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
191 mp_msg(MSGT_VO, MSGL_FATAL, |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
192 "vo_macosx: failed to map shared memory. Error: %s\n", strerror(errno)); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
193 shm_unlink("mplayerosx"); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
194 return 1; |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
195 } |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
196 |
16385 | 197 //connnect to mplayerosx |
198 mplayerosxProxy=[NSConnection rootProxyForConnectionWithRegisteredName:@"mplayerosx" host:nil]; | |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
199 if ([mplayerosxProxy conformsToProtocol:@protocol(MPlayerOSXVOProto)]) { |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
200 [mplayerosxProxy setProtocolForProxy:@protocol(MPlayerOSXVOProto)]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
201 mplayerosxProto = (id <MPlayerOSXVOProto>)mplayerosxProxy; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
202 [mplayerosxProto startWithWidth: image_width withHeight: image_height withBytes: image_bytes withAspect:(int)(movie_aspect*100)]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
203 } |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
204 else { |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
205 [mplayerosxProxy release]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
206 mplayerosxProxy = nil; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
207 mplayerosxProto = nil; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
208 } |
16385 | 209 } |
15289 | 210 return 0; |
211 } | |
212 | |
213 static void check_events(void) | |
214 { | |
15611 | 215 [mpGLView check_events]; |
15289 | 216 } |
217 | |
218 static void draw_osd(void) | |
219 { | |
220 vo_draw_text(image_width, image_height, draw_alpha); | |
221 } | |
222 | |
223 static void flip_page(void) | |
224 { | |
16385 | 225 if(shared_buffer) |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
226 [mplayerosxProto render]; |
25114
bed4188998ca
Move the setCurrentTexture call into flip_page(), fix osd flicker problem.
ulion
parents:
25078
diff
changeset
|
227 else { |
bed4188998ca
Move the setCurrentTexture call into flip_page(), fix osd flicker problem.
ulion
parents:
25078
diff
changeset
|
228 [mpGLView setCurrentTexture]; |
16385 | 229 [mpGLView render]; |
25180 | 230 if (vo_doublebuffering) { |
231 image_page = 1 - image_page; | |
232 image_data = image_datas[image_page]; | |
233 } | |
25114
bed4188998ca
Move the setCurrentTexture call into flip_page(), fix osd flicker problem.
ulion
parents:
25078
diff
changeset
|
234 } |
15289 | 235 } |
236 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
237 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y) |
15289 | 238 { |
239 return 0; | |
240 } | |
241 | |
242 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
243 static int draw_frame(uint8_t *src[]) |
15289 | 244 { |
245 switch (image_format) | |
246 { | |
247 case IMGFMT_BGR32: | |
248 case IMGFMT_RGB32: | |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23381
diff
changeset
|
249 fast_memcpy(image_data, src[0], image_width*image_height*image_bytes); |
15289 | 250 break; |
251 | |
252 case IMGFMT_YUY2: | |
253 memcpy_pic(image_data, src[0], image_width * 2, image_height, image_width * 2, image_width * 2); | |
254 break; | |
255 } | |
16385 | 256 |
15289 | 257 return 0; |
258 } | |
259 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
260 static int query_format(uint32_t format) |
15289 | 261 { |
262 image_format = format; | |
263 | |
264 switch(format) | |
265 { | |
266 case IMGFMT_YUY2: | |
267 pixelFormat = kYUVSPixelFormat; | |
268 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN; | |
269 | |
270 case IMGFMT_RGB32: | |
271 case IMGFMT_BGR32: | |
272 pixelFormat = k32ARGBPixelFormat; | |
273 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN; | |
274 } | |
275 return 0; | |
276 } | |
277 | |
278 static void uninit(void) | |
279 { | |
16385 | 280 if(shared_buffer) |
281 { | |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
282 [mplayerosxProto stop]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
283 mplayerosxProto = nil; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
284 [mplayerosxProxy release]; |
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
285 mplayerosxProxy = nil; |
28016
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
286 |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
287 if (munmap(image_data, image_width*image_height*image_bytes) == -1) |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
288 mp_msg(MSGT_VO, MSGL_FATAL, "uninit: munmap failed. Error: %s\n", strerror(errno)); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
289 |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
290 if (shm_unlink("mplayerosx") == -1) |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
291 mp_msg(MSGT_VO, MSGL_FATAL, "uninit: shm_unlink failed. Error: %s\n", strerror(errno)); |
3b8e66828e10
use mmap instead of shmat for MPlayerOSX, patch by Adrian Stutz<adrian@sttz.ch>
nplourde
parents:
28010
diff
changeset
|
292 |
16385 | 293 } |
294 | |
21551 | 295 SetSystemUIMode( kUIModeNormal, 0); |
296 CGDisplayShowCursor(kCGDirectMainDisplay); | |
297 | |
298 if(mpGLView) | |
299 { | |
25136 | 300 NSAutoreleasePool *finalPool; |
24742
0bef706332b5
Fix deallocate bug which sometimes causes a crash when reinitializing.
nplourde
parents:
24698
diff
changeset
|
301 mpGLView = nil; |
21551 | 302 [autoreleasepool release]; |
25136 | 303 finalPool = [[NSAutoreleasePool alloc] init]; |
25078
3efbdaab822f
Let NSApp handle events when uninit to fix the delay dealloc bug of mpGLView.
ulion
parents:
24965
diff
changeset
|
304 [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; |
3efbdaab822f
Let NSApp handle events when uninit to fix the delay dealloc bug of mpGLView.
ulion
parents:
24965
diff
changeset
|
305 [finalPool release]; |
21551 | 306 } |
25121 | 307 if (!shared_buffer) |
308 { | |
25180 | 309 free(image_datas[0]); |
310 if (vo_doublebuffering) | |
311 free(image_datas[1]); | |
312 image_datas[0] = NULL; | |
313 image_datas[1] = NULL; | |
25121 | 314 image_data = NULL; |
315 } | |
15289 | 316 } |
317 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
318 static int preinit(const char *arg) |
15289 | 319 { |
320 int parse_err = 0; | |
321 | |
15728 | 322 if(arg) |
323 { | |
324 char *parse_pos = (char *)&arg[0]; | |
325 while (parse_pos[0] && !parse_err) | |
326 { | |
327 if (strncmp (parse_pos, "device_id=", 10) == 0) | |
328 { | |
329 parse_pos = &parse_pos[10]; | |
330 screen_id = strtol(parse_pos, &parse_pos, 0); | |
331 screen_force = YES; | |
332 } | |
16385 | 333 if (strncmp (parse_pos, "shared_buffer", 13) == 0) |
334 { | |
335 parse_pos = &parse_pos[13]; | |
336 shared_buffer = YES; | |
337 } | |
15728 | 338 if (parse_pos[0] == ':') parse_pos = &parse_pos[1]; |
339 else if (parse_pos[0]) parse_err = 1; | |
340 } | |
341 } | |
342 | |
15737
0c3939433cef
set nsapp and setup cocoa with NSApplicationLoad
nplourde
parents:
15736
diff
changeset
|
343 NSApplicationLoad(); |
15289 | 344 autoreleasepool = [[NSAutoreleasePool alloc] init]; |
15737
0c3939433cef
set nsapp and setup cocoa with NSApplicationLoad
nplourde
parents:
15736
diff
changeset
|
345 NSApp = [NSApplication sharedApplication]; |
25179
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
346 isLeopardOrLater = floor(NSAppKitVersionNumber) > 824; |
15726 | 347 |
16385 | 348 if(!shared_buffer) |
16144 | 349 { |
27397
d47744b95b78
Give a CONFIG_ prefix to preprocessor directives that lacked one and
diego
parents:
27394
diff
changeset
|
350 #if !defined (CONFIG_MACOSX_FINDER) || !defined (CONFIG_SDL) |
17358
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
351 //this chunk of code is heavily based off SDL_macosx.m from SDL |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
352 ProcessSerialNumber myProc, frProc; |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
353 Boolean sameProc; |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
354 |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
355 if (GetFrontProcess(&frProc) == noErr) |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
356 { |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
357 if (GetCurrentProcess(&myProc) == noErr) |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
358 { |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
359 if (SameProcess(&frProc, &myProc, &sameProc) == noErr && !sameProc) |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
360 { |
27988 | 361 TransformProcessType(&myProc, kProcessTransformToForegroundApplication); |
17358
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
362 } |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
363 SetFrontProcess(&myProc); |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
364 } |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
365 } |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
366 #endif |
22ec2e9cb530
do not give focus to vo_macosx in shared buffer mode. Patch by Hector Chu<hectorchu@gmail.com>
nplourde
parents:
16385
diff
changeset
|
367 |
16385 | 368 if(!mpGLView) |
369 { | |
370 mpGLView = [[MPlayerOpenGLView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100) pixelFormat:[MPlayerOpenGLView defaultPixelFormat]]; | |
371 [mpGLView autorelease]; | |
372 } | |
373 | |
374 [mpGLView display]; | |
375 [mpGLView preinit]; | |
16144 | 376 } |
377 | |
15289 | 378 return 0; |
379 } | |
380 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
16145
diff
changeset
|
381 static int control(uint32_t request, void *data, ...) |
15289 | 382 { |
383 switch (request) | |
384 { | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25468
diff
changeset
|
385 case VOCTRL_PAUSE: return int_pause = 1; |
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25468
diff
changeset
|
386 case VOCTRL_RESUME: return int_pause = 0; |
15289 | 387 case VOCTRL_QUERY_FORMAT: return query_format(*((uint32_t*)data)); |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
388 case VOCTRL_ONTOP: vo_ontop = (!(vo_ontop)); if(!shared_buffer){ [mpGLView ontop]; } else { [mplayerosxProto ontop]; } return VO_TRUE; |
15611 | 389 case VOCTRL_ROOTWIN: vo_rootwin = (!(vo_rootwin)); [mpGLView rootwin]; return VO_TRUE; |
25157
cf3b6015735d
Set protocol for the vo proxy used in shared-buffer mode.
ulion
parents:
25137
diff
changeset
|
390 case VOCTRL_FULLSCREEN: vo_fs = (!(vo_fs)); if(!shared_buffer){ [mpGLView fullscreen: NO]; } else { [mplayerosxProto toggleFullscreen]; } return VO_TRUE; |
15289 | 391 case VOCTRL_GET_PANSCAN: return VO_TRUE; |
15611 | 392 case VOCTRL_SET_PANSCAN: [mpGLView panscan]; return VO_TRUE; |
15289 | 393 } |
394 return VO_NOTIMPL; | |
395 } | |
396 | |
397 ////////////////////////////////////////////////////////////////////////// | |
398 // NSOpenGLView Subclass | |
399 ////////////////////////////////////////////////////////////////////////// | |
15611 | 400 @implementation MPlayerOpenGLView |
24076 | 401 - (void) preinit |
15289 | 402 { |
15726 | 403 //init menu |
404 [self initMenu]; | |
405 | |
406 //create window | |
15747
fbf14e1ab725
osx 10.3 dont like to have a window init with no size
nplourde
parents:
15737
diff
changeset
|
407 window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100) |
15726 | 408 styleMask:NSTitledWindowMask|NSTexturedBackgroundWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask |
409 backing:NSBackingStoreBuffered defer:NO]; | |
410 | |
16144 | 411 [window autorelease]; |
15726 | 412 [window setDelegate:mpGLView]; |
413 [window setContentView:mpGLView]; | |
414 [window setInitialFirstResponder:mpGLView]; | |
415 [window setAcceptsMouseMovedEvents:YES]; | |
416 [window setTitle:@"MPlayer - The Movie Player"]; | |
417 | |
418 isFullscreen = 0; | |
15855 | 419 winSizeMult = 1; |
15726 | 420 } |
421 | |
24076 | 422 - (void) config |
15726 | 423 { |
424 uint32_t d_width; | |
425 uint32_t d_height; | |
426 | |
25137 | 427 GLint swapInterval = 1; |
15726 | 428 |
429 NSRect frame; | |
15289 | 430 CVReturn error = kCVReturnSuccess; |
431 | |
15728 | 432 //config window |
15726 | 433 aspect((int *)&d_width, (int *)&d_height,A_NOZOOM); |
434 frame = NSMakeRect(0, 0, d_width, d_height); | |
435 [window setContentSize: frame.size]; | |
15570 | 436 |
15289 | 437 //create OpenGL Context |
438 glContext = [[NSOpenGLContext alloc] initWithFormat:[NSOpenGLView defaultPixelFormat] shareContext:nil]; | |
15647 | 439 |
15289 | 440 [self setOpenGLContext:glContext]; |
15647 | 441 [glContext setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; |
15289 | 442 [glContext setView:self]; |
443 [glContext makeCurrentContext]; | |
444 | |
25180 | 445 error = CVPixelBufferCreateWithBytes(NULL, image_width, image_height, pixelFormat, image_datas[0], image_width*image_bytes, NULL, NULL, NULL, &frameBuffers[0]); |
15289 | 446 if(error != kCVReturnSuccess) |
447 mp_msg(MSGT_VO, MSGL_ERR,"Failed to create Pixel Buffer(%d)\n", error); | |
25180 | 448 if (vo_doublebuffering) { |
449 error = CVPixelBufferCreateWithBytes(NULL, image_width, image_height, pixelFormat, image_datas[1], image_width*image_bytes, NULL, NULL, NULL, &frameBuffers[1]); | |
450 if(error != kCVReturnSuccess) | |
451 mp_msg(MSGT_VO, MSGL_ERR,"Failed to create Pixel Double Buffer(%d)\n", error); | |
452 } | |
15289 | 453 |
454 error = CVOpenGLTextureCacheCreate(NULL, 0, [glContext CGLContextObj], [[self pixelFormat] CGLPixelFormatObj], 0, &textureCache); | |
455 if(error != kCVReturnSuccess) | |
456 mp_msg(MSGT_VO, MSGL_ERR,"Failed to create OpenGL texture Cache(%d)\n", error); | |
457 | |
25180 | 458 error = CVOpenGLTextureCacheCreateTextureFromImage(NULL, textureCache, frameBuffers[image_page], 0, &texture); |
15289 | 459 if(error != kCVReturnSuccess) |
460 mp_msg(MSGT_VO, MSGL_ERR,"Failed to create OpenGL texture(%d)\n", error); | |
461 | |
15728 | 462 //show window |
463 [window center]; | |
464 [window makeKeyAndOrderFront:mpGLView]; | |
465 | |
15726 | 466 if(vo_rootwin) |
467 [mpGLView rootwin]; | |
468 | |
469 if(vo_fs) | |
470 [mpGLView fullscreen: NO]; | |
471 | |
472 if(vo_ontop) | |
473 [mpGLView ontop]; | |
15289 | 474 } |
475 | |
476 /* | |
15570 | 477 Init Menu |
478 */ | |
479 - (void)initMenu | |
480 { | |
21395 | 481 NSMenu *menu, *aspectMenu; |
15570 | 482 NSMenuItem *menuItem; |
483 | |
484 [NSApp setMainMenu:[[NSMenu alloc] init]]; | |
485 | |
486 //Create Movie Menu | |
487 menu = [[NSMenu alloc] initWithTitle:@"Movie"]; | |
488 menuItem = [[NSMenuItem alloc] initWithTitle:@"Half Size" action:@selector(menuAction:) keyEquivalent:@"0"]; [menu addItem:menuItem]; | |
489 kHalfScreenCmd = menuItem; | |
490 menuItem = [[NSMenuItem alloc] initWithTitle:@"Normal Size" action:@selector(menuAction:) keyEquivalent:@"1"]; [menu addItem:menuItem]; | |
491 kNormalScreenCmd = menuItem; | |
492 menuItem = [[NSMenuItem alloc] initWithTitle:@"Double Size" action:@selector(menuAction:) keyEquivalent:@"2"]; [menu addItem:menuItem]; | |
493 kDoubleScreenCmd = menuItem; | |
494 menuItem = [[NSMenuItem alloc] initWithTitle:@"Full Size" action:@selector(menuAction:) keyEquivalent:@"f"]; [menu addItem:menuItem]; | |
495 kFullScreenCmd = menuItem; | |
15909 | 496 menuItem = (NSMenuItem *)[NSMenuItem separatorItem]; [menu addItem:menuItem]; |
15570 | 497 |
498 aspectMenu = [[NSMenu alloc] initWithTitle:@"Aspect Ratio"]; | |
499 menuItem = [[NSMenuItem alloc] initWithTitle:@"Keep" action:@selector(menuAction:) keyEquivalent:@""]; [aspectMenu addItem:menuItem]; | |
500 if(vo_keepaspect) [menuItem setState:NSOnState]; | |
501 kKeepAspectCmd = menuItem; | |
502 menuItem = [[NSMenuItem alloc] initWithTitle:@"Pan-Scan" action:@selector(menuAction:) keyEquivalent:@""]; [aspectMenu addItem:menuItem]; | |
503 if(vo_panscan) [menuItem setState:NSOnState]; | |
504 kPanScanCmd = menuItem; | |
15909 | 505 menuItem = (NSMenuItem *)[NSMenuItem separatorItem]; [aspectMenu addItem:menuItem]; |
15570 | 506 menuItem = [[NSMenuItem alloc] initWithTitle:@"Original" action:@selector(menuAction:) keyEquivalent:@""]; [aspectMenu addItem:menuItem]; |
507 kAspectOrgCmd = menuItem; | |
508 menuItem = [[NSMenuItem alloc] initWithTitle:@"4:3" action:@selector(menuAction:) keyEquivalent:@""]; [aspectMenu addItem:menuItem]; | |
509 kAspectFullCmd = menuItem; | |
510 menuItem = [[NSMenuItem alloc] initWithTitle:@"16:9" action:@selector(menuAction:) keyEquivalent:@""]; [aspectMenu addItem:menuItem]; | |
511 kAspectWideCmd = menuItem; | |
512 menuItem = [[NSMenuItem alloc] initWithTitle:@"Aspect Ratio" action:nil keyEquivalent:@""]; | |
513 [menuItem setSubmenu:aspectMenu]; | |
514 [menu addItem:menuItem]; | |
515 [aspectMenu release]; | |
516 | |
517 //Add to menubar | |
518 menuItem = [[NSMenuItem alloc] initWithTitle:@"Movie" action:nil keyEquivalent:@""]; | |
519 [menuItem setSubmenu:menu]; | |
520 [[NSApp mainMenu] addItem:menuItem]; | |
521 | |
522 //Create Window Menu | |
523 menu = [[NSMenu alloc] initWithTitle:@"Window"]; | |
524 | |
525 menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; [menu addItem:menuItem]; | |
526 menuItem = [[NSMenuItem alloc] initWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; [menu addItem:menuItem]; | |
527 | |
528 //Add to menubar | |
529 menuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; | |
530 [menuItem setSubmenu:menu]; | |
531 [[NSApp mainMenu] addItem:menuItem]; | |
532 [NSApp setWindowsMenu:menu]; | |
533 | |
534 [menu release]; | |
535 [menuItem release]; | |
536 } | |
537 | |
538 /* | |
539 Menu Action | |
540 */ | |
541 - (void)menuAction:(id)sender | |
542 { | |
543 uint32_t d_width; | |
544 uint32_t d_height; | |
545 NSRect frame; | |
546 | |
547 aspect((int *)&d_width, (int *)&d_height,A_NOZOOM); | |
15731 | 548 |
549 if(sender == kQuitCmd) | |
550 { | |
551 mplayer_put_key(KEY_ESC); | |
552 } | |
15570 | 553 |
554 if(sender == kHalfScreenCmd) | |
555 { | |
556 if(isFullscreen) { | |
21546
253a1e98bfe3
vo_macosx.m disable window animation when going to fullscreen
nplourde
parents:
21395
diff
changeset
|
557 vo_fs = (!(vo_fs)); [self fullscreen:NO]; |
15570 | 558 } |
559 | |
15855 | 560 winSizeMult = 0.5; |
561 frame.size.width = (d_width*winSizeMult); | |
562 frame.size.height = ((d_width/movie_aspect)*winSizeMult); | |
15570 | 563 [window setContentSize: frame.size]; |
564 [self reshape]; | |
565 } | |
566 if(sender == kNormalScreenCmd) | |
567 { | |
568 if(isFullscreen) { | |
21546
253a1e98bfe3
vo_macosx.m disable window animation when going to fullscreen
nplourde
parents:
21395
diff
changeset
|
569 vo_fs = (!(vo_fs)); [self fullscreen:NO]; |
15570 | 570 } |
571 | |
15855 | 572 winSizeMult = 1; |
15570 | 573 frame.size.width = d_width; |
574 frame.size.height = d_width/movie_aspect; | |
575 [window setContentSize: frame.size]; | |
576 [self reshape]; | |
577 } | |
578 if(sender == kDoubleScreenCmd) | |
579 { | |
580 if(isFullscreen) { | |
21546
253a1e98bfe3
vo_macosx.m disable window animation when going to fullscreen
nplourde
parents:
21395
diff
changeset
|
581 vo_fs = (!(vo_fs)); [self fullscreen:NO]; |
15570 | 582 } |
583 | |
15855 | 584 winSizeMult = 2; |
585 frame.size.width = d_width*winSizeMult; | |
586 frame.size.height = (d_width/movie_aspect)*winSizeMult; | |
15570 | 587 [window setContentSize: frame.size]; |
588 [self reshape]; | |
589 } | |
590 if(sender == kFullScreenCmd) | |
591 { | |
592 vo_fs = (!(vo_fs)); | |
21546
253a1e98bfe3
vo_macosx.m disable window animation when going to fullscreen
nplourde
parents:
21395
diff
changeset
|
593 [self fullscreen:NO]; |
15570 | 594 } |
595 | |
596 if(sender == kKeepAspectCmd) | |
597 { | |
598 vo_keepaspect = (!(vo_keepaspect)); | |
599 if(vo_keepaspect) | |
600 [kKeepAspectCmd setState:NSOnState]; | |
601 else | |
602 [kKeepAspectCmd setState:NSOffState]; | |
15909 | 603 |
604 [self reshape]; | |
15570 | 605 } |
606 | |
607 if(sender == kPanScanCmd) | |
608 { | |
609 vo_panscan = (!(vo_panscan)); | |
610 if(vo_panscan) | |
611 [kPanScanCmd setState:NSOnState]; | |
612 else | |
613 [kPanScanCmd setState:NSOffState]; | |
15902
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
614 |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
615 [self panscan]; |
15570 | 616 } |
617 | |
618 if(sender == kAspectOrgCmd) | |
619 { | |
620 movie_aspect = old_movie_aspect; | |
15902
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
621 |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
622 if(isFullscreen) |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
623 { |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
624 [self reshape]; |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
625 } |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
626 else |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
627 { |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
628 frame.size.width = d_width*winSizeMult; |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
629 frame.size.height = (d_width/movie_aspect)*winSizeMult; |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
630 [window setContentSize: frame.size]; |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
631 [self reshape]; |
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
632 } |
15570 | 633 } |
634 | |
635 if(sender == kAspectFullCmd) | |
636 { | |
637 movie_aspect = 4.0f/3.0f; | |
15882 | 638 |
639 if(isFullscreen) | |
640 { | |
641 [self reshape]; | |
642 } | |
643 else | |
644 { | |
645 frame.size.width = d_width*winSizeMult; | |
646 frame.size.height = (d_width/movie_aspect)*winSizeMult; | |
647 [window setContentSize: frame.size]; | |
648 [self reshape]; | |
649 } | |
15570 | 650 } |
651 | |
652 if(sender == kAspectWideCmd) | |
653 { | |
654 movie_aspect = 16.0f/9.0f; | |
15882 | 655 |
656 if(isFullscreen) | |
657 { | |
658 [self reshape]; | |
659 } | |
660 else | |
661 { | |
662 frame.size.width = d_width*winSizeMult; | |
663 frame.size.height = (d_width/movie_aspect)*winSizeMult; | |
664 [window setContentSize: frame.size]; | |
665 [self reshape]; | |
666 } | |
15570 | 667 } |
668 } | |
669 | |
670 /* | |
15289 | 671 Setup OpenGL |
672 */ | |
673 - (void)prepareOpenGL | |
674 { | |
15339 | 675 glEnable(GL_BLEND); |
15289 | 676 glDisable(GL_DEPTH_TEST); |
677 glDepthMask(GL_FALSE); | |
678 glDisable(GL_CULL_FACE); | |
679 [self reshape]; | |
680 } | |
681 | |
682 /* | |
683 reshape OpenGL viewport | |
684 */ | |
685 - (void)reshape | |
686 { | |
687 uint32_t d_width; | |
688 uint32_t d_height; | |
689 float aspectX; | |
690 float aspectY; | |
691 int padding = 0; | |
692 | |
693 NSRect frame = [self frame]; | |
694 | |
695 glViewport(0, 0, frame.size.width, frame.size.height); | |
696 glMatrixMode(GL_PROJECTION); | |
697 glLoadIdentity(); | |
698 glOrtho(0, frame.size.width, frame.size.height, 0, -1.0, 1.0); | |
699 glMatrixMode(GL_MODELVIEW); | |
700 glLoadIdentity(); | |
701 | |
15729 | 702 //set texture frame |
15289 | 703 if(vo_keepaspect) |
704 { | |
15571 | 705 aspect( (int *)&d_width, (int *)&d_height, A_NOZOOM); |
15289 | 706 d_height = ((float)d_width/movie_aspect); |
707 | |
708 aspectX = (float)((float)frame.size.width/(float)d_width); | |
709 aspectY = (float)((float)(frame.size.height)/(float)d_height); | |
710 | |
711 if((d_height*aspectX)>(frame.size.height)) | |
712 { | |
713 padding = (frame.size.width - d_width*aspectY)/2; | |
25424 | 714 textureFrame = NSMakeRect(padding, 0, d_width*aspectY, d_height*aspectY); |
15289 | 715 } |
716 else | |
717 { | |
718 padding = ((frame.size.height) - d_height*aspectX)/2; | |
25424 | 719 textureFrame = NSMakeRect(0, padding, d_width*aspectX, d_height*aspectX); |
15289 | 720 } |
721 } | |
722 else | |
723 { | |
15729 | 724 textureFrame = frame; |
15289 | 725 } |
25446 | 726 vo_dwidth = textureFrame.size.width; |
727 vo_dheight = textureFrame.size.height; | |
15289 | 728 } |
729 | |
730 /* | |
731 Render frame | |
732 */ | |
733 - (void) render | |
734 { | |
21395 | 735 int curTime; |
24953
aca7d0259d90
Fix the prevent system idle code. Original code also works, but not as expected.
ulion
parents:
24742
diff
changeset
|
736 static int lastTime = 0; |
21395 | 737 |
15289 | 738 glClear(GL_COLOR_BUFFER_BIT); |
739 | |
740 glEnable(CVOpenGLTextureGetTarget(texture)); | |
741 glBindTexture(CVOpenGLTextureGetTarget(texture), CVOpenGLTextureGetName(texture)); | |
742 | |
743 glColor3f(1,1,1); | |
744 glBegin(GL_QUADS); | |
15729 | 745 glTexCoord2f(upperLeft[0], upperLeft[1]); glVertex2i( textureFrame.origin.x-(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); |
25424 | 746 glTexCoord2f(lowerLeft[0], lowerLeft[1]); glVertex2i(textureFrame.origin.x-(vo_panscan_x >> 1), NSMaxY(textureFrame)+(vo_panscan_y >> 1)); |
747 glTexCoord2f(lowerRight[0], lowerRight[1]); glVertex2i(NSMaxX(textureFrame)+(vo_panscan_x >> 1), NSMaxY(textureFrame)+(vo_panscan_y >> 1)); | |
748 glTexCoord2f(upperRight[0], upperRight[1]); glVertex2i(NSMaxX(textureFrame)+(vo_panscan_x >> 1), textureFrame.origin.y-(vo_panscan_y >> 1)); | |
15289 | 749 glEnd(); |
15339 | 750 glDisable(CVOpenGLTextureGetTarget(texture)); |
751 | |
752 //render resize box | |
753 if(!isFullscreen) | |
754 { | |
755 NSRect frame = [self frame]; | |
756 | |
757 glBegin(GL_LINES); | |
758 glColor4f(0.2, 0.2, 0.2, 0.5); | |
759 glVertex2i(frame.size.width-1, frame.size.height-1); glVertex2i(frame.size.width-1, frame.size.height-1); | |
760 glVertex2i(frame.size.width-1, frame.size.height-5); glVertex2i(frame.size.width-5, frame.size.height-1); | |
761 glVertex2i(frame.size.width-1, frame.size.height-9); glVertex2i(frame.size.width-9, frame.size.height-1); | |
762 | |
763 glColor4f(0.4, 0.4, 0.4, 0.5); | |
764 glVertex2i(frame.size.width-1, frame.size.height-2); glVertex2i(frame.size.width-2, frame.size.height-1); | |
765 glVertex2i(frame.size.width-1, frame.size.height-6); glVertex2i(frame.size.width-6, frame.size.height-1); | |
766 glVertex2i(frame.size.width-1, frame.size.height-10); glVertex2i(frame.size.width-10, frame.size.height-1); | |
767 | |
768 glColor4f(0.6, 0.6, 0.6, 0.5); | |
769 glVertex2i(frame.size.width-1, frame.size.height-3); glVertex2i(frame.size.width-3, frame.size.height-1); | |
770 glVertex2i(frame.size.width-1, frame.size.height-7); glVertex2i(frame.size.width-7, frame.size.height-1); | |
771 glVertex2i(frame.size.width-1, frame.size.height-11); glVertex2i(frame.size.width-11, frame.size.height-1); | |
772 glEnd(); | |
773 } | |
15289 | 774 |
775 glFlush(); | |
776 | |
28010
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
777 curTime = TickCount()/60; |
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
778 |
28001 | 779 //auto hide mouse cursor (and future on-screen control?) |
15327 | 780 if(isFullscreen && !mouseHide && !isRootwin) |
15289 | 781 { |
28010
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
782 if( ((curTime - lastMouseHide) >= 5) || (lastMouseHide == 0) ) |
15289 | 783 { |
18057 | 784 CGDisplayHideCursor(kCGDirectMainDisplay); |
28010
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
785 mouseHide = TRUE; |
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
786 lastMouseHide = curTime; |
15289 | 787 } |
788 } | |
17546 | 789 |
17725 | 790 //update activity every 30 seconds to prevent |
17546 | 791 //screensaver from starting up. |
28010
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
792 if( ((curTime - lastScreensaverUpdate) >= 30) || (lastScreensaverUpdate == 0) ) |
17546 | 793 { |
794 UpdateSystemActivity(UsrActivity); | |
28010
0a0f63090e60
factorize mouse hiding and screensaver disabling code
gpoirier
parents:
28001
diff
changeset
|
795 lastScreensaverUpdate = curTime; |
17546 | 796 } |
15289 | 797 } |
798 | |
799 /* | |
800 Create OpenGL texture from current frame & set texco | |
801 */ | |
802 - (void) setCurrentTexture | |
803 { | |
804 CVReturn error = kCVReturnSuccess; | |
805 | |
25180 | 806 error = CVOpenGLTextureCacheCreateTextureFromImage(NULL, textureCache, frameBuffers[image_page], 0, &texture); |
15289 | 807 if(error != kCVReturnSuccess) |
808 mp_msg(MSGT_VO, MSGL_ERR,"Failed to create OpenGL texture(%d)\n", error); | |
809 | |
810 CVOpenGLTextureGetCleanTexCoords(texture, lowerLeft, lowerRight, upperRight, upperLeft); | |
811 } | |
812 | |
813 /* | |
814 redraw win rect | |
815 */ | |
816 - (void) drawRect: (NSRect *) bounds | |
817 { | |
818 [self render]; | |
819 } | |
820 | |
821 /* | |
822 Toggle Fullscreen | |
823 */ | |
824 - (void) fullscreen: (BOOL) animate | |
825 { | |
826 static NSRect old_frame; | |
827 static NSRect old_view_frame; | |
15728 | 828 |
15573 | 829 panscan_calc(); |
830 | |
15289 | 831 //go fullscreen |
832 if(vo_fs) | |
833 { | |
15327 | 834 if(!isRootwin) |
835 { | |
15882 | 836 SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar); |
18057 | 837 CGDisplayHideCursor(kCGDirectMainDisplay); |
15327 | 838 mouseHide = YES; |
839 } | |
15289 | 840 |
841 old_frame = [window frame]; //save main window size & position | |
25413 | 842 if(screen_force) |
843 screen_frame = [screen_handle frame]; | |
25414
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
844 else { |
25413 | 845 screen_frame = [[window screen] frame]; |
25414
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
846 vo_screenwidth = screen_frame.size.width; |
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
847 vo_screenheight = screen_frame.size.height; |
5c03a9bdf220
Record screen size and display size in vo_ variables.
ulion
parents:
25413
diff
changeset
|
848 } |
25413 | 849 |
15728 | 850 [window setFrame:screen_frame display:YES animate:animate]; //zoom-in window with nice useless sfx |
15289 | 851 old_view_frame = [self bounds]; |
852 | |
853 //fix origin for multi screen setup | |
15728 | 854 screen_frame.origin.x = 0; |
855 screen_frame.origin.y = 0; | |
856 [self setFrame:screen_frame]; | |
15289 | 857 [self setNeedsDisplay:YES]; |
858 [window setHasShadow:NO]; | |
859 isFullscreen = 1; | |
860 } | |
861 else | |
15882 | 862 { |
15902
16534910f0fb
fix various window resizing bug with menu option
nplourde
parents:
15882
diff
changeset
|
863 SetSystemUIMode( kUIModeNormal, 0); |
15882 | 864 |
15289 | 865 isFullscreen = 0; |
18057 | 866 CGDisplayShowCursor(kCGDirectMainDisplay); |
15289 | 867 mouseHide = NO; |
868 | |
869 //revert window to previous setting | |
870 [self setFrame:old_view_frame]; | |
871 [self setNeedsDisplay:YES]; | |
16081
72c352edce8f
restore window shadow when quitting fullscreen mode
nplourde
parents:
15909
diff
changeset
|
872 [window setHasShadow:YES]; |
15289 | 873 [window setFrame:old_frame display:YES animate:animate];//zoom-out window with nice useless sfx |
874 } | |
875 } | |
876 | |
877 /* | |
878 Toggle ontop | |
879 */ | |
880 - (void) ontop | |
881 { | |
15320 | 882 if(vo_ontop) |
883 { | |
884 [window setLevel:NSScreenSaverWindowLevel]; | |
885 isOntop = YES; | |
886 } | |
887 else | |
888 { | |
889 [window setLevel:NSNormalWindowLevel]; | |
890 isOntop = NO; | |
891 } | |
15289 | 892 } |
893 | |
894 /* | |
895 Toggle panscan | |
896 */ | |
897 - (void) panscan | |
898 { | |
15331 | 899 panscan_calc(); |
15289 | 900 } |
901 | |
902 /* | |
15327 | 903 Toggle rootwin |
904 */ | |
905 - (void) rootwin | |
906 { | |
907 if(vo_rootwin) | |
908 { | |
909 [window setLevel:CGWindowLevelForKey(kCGDesktopWindowLevelKey)]; | |
910 [window orderBack:self]; | |
911 isRootwin = YES; | |
912 } | |
913 else | |
914 { | |
915 [window setLevel:NSNormalWindowLevel]; | |
916 isRootwin = NO; | |
917 } | |
918 } | |
919 | |
920 /* | |
15289 | 921 Check event for new event |
922 */ | |
923 - (void) check_events | |
924 { | |
925 event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate dateWithTimeIntervalSinceNow:0.0001] inMode:NSEventTrackingRunLoopMode dequeue:YES]; | |
25178 | 926 if (event == nil) |
927 return; | |
15289 | 928 [NSApp sendEvent:event]; |
25179
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
929 // Without SDL's bootstrap code (include SDL.h in mplayer.c), |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
930 // on Leopard, we got trouble to get the play window auto focused |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
931 // when app is actived. Following code fix this problem. |
27370
14c5017f40d2
Change a bunch of video/audio-output-specific preprocessor directives from
diego
parents:
26755
diff
changeset
|
932 #ifndef CONFIG_SDL |
25179
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
933 if (isLeopardOrLater && [event type] == NSAppKitDefined |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
934 && [event subtype] == NSApplicationActivatedEventType) { |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
935 [window makeMainWindow]; |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
936 [window makeKeyAndOrderFront:mpGLView]; |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
937 } |
6e8b40d412f0
Fix play window not get actived problem on Leopard.
ulion
parents:
25178
diff
changeset
|
938 #endif |
15289 | 939 } |
940 | |
941 /* | |
15731 | 942 From NSView, respond to key equivalents. |
943 */ | |
944 - (BOOL)performKeyEquivalent:(NSEvent *)theEvent | |
945 { | |
946 switch([theEvent keyCode]) | |
947 { | |
948 case 0x21: [window setAlphaValue: winAlpha-=0.05]; return YES; | |
949 case 0x1e: [window setAlphaValue: winAlpha+=0.05]; return YES; | |
950 } | |
951 return NO; | |
952 } | |
953 | |
954 /* | |
15289 | 955 Process key event |
956 */ | |
957 - (void) keyDown: (NSEvent *) theEvent | |
958 { | |
959 unsigned int key; | |
960 | |
961 switch([theEvent keyCode]) | |
962 { | |
963 case 0x34: | |
964 case 0x24: key = KEY_ENTER; break; | |
965 case 0x35: key = KEY_ESC; break; | |
966 case 0x33: key = KEY_BACKSPACE; break; | |
967 case 0x3A: key = KEY_BACKSPACE; break; | |
968 case 0x3B: key = KEY_BACKSPACE; break; | |
969 case 0x38: key = KEY_BACKSPACE; break; | |
970 case 0x7A: key = KEY_F+1; break; | |
971 case 0x78: key = KEY_F+2; break; | |
972 case 0x63: key = KEY_F+3; break; | |
973 case 0x76: key = KEY_F+4; break; | |
974 case 0x60: key = KEY_F+5; break; | |
975 case 0x61: key = KEY_F+6; break; | |
976 case 0x62: key = KEY_F+7; break; | |
977 case 0x64: key = KEY_F+8; break; | |
978 case 0x65: key = KEY_F+9; break; | |
979 case 0x6D: key = KEY_F+10; break; | |
980 case 0x67: key = KEY_F+11; break; | |
981 case 0x6F: key = KEY_F+12; break; | |
982 case 0x72: key = KEY_INSERT; break; | |
983 case 0x75: key = KEY_DELETE; break; | |
984 case 0x73: key = KEY_HOME; break; | |
985 case 0x77: key = KEY_END; break; | |
986 case 0x45: key = '+'; break; | |
987 case 0x4E: key = '-'; break; | |
988 case 0x30: key = KEY_TAB; break; | |
989 case 0x74: key = KEY_PAGE_UP; break; | |
990 case 0x79: key = KEY_PAGE_DOWN; break; | |
991 case 0x7B: key = KEY_LEFT; break; | |
992 case 0x7C: key = KEY_RIGHT; break; | |
993 case 0x7D: key = KEY_DOWN; break; | |
994 case 0x7E: key = KEY_UP; break; | |
995 case 0x43: key = '*'; break; | |
996 case 0x4B: key = '/'; break; | |
24107 | 997 case 0x4C: key = KEY_KPENTER; break; |
15289 | 998 case 0x41: key = KEY_KPDEC; break; |
999 case 0x52: key = KEY_KP0; break; | |
1000 case 0x53: key = KEY_KP1; break; | |
1001 case 0x54: key = KEY_KP2; break; | |
1002 case 0x55: key = KEY_KP3; break; | |
1003 case 0x56: key = KEY_KP4; break; | |
1004 case 0x57: key = KEY_KP5; break; | |
1005 case 0x58: key = KEY_KP6; break; | |
1006 case 0x59: key = KEY_KP7; break; | |
1007 case 0x5B: key = KEY_KP8; break; | |
1008 case 0x5C: key = KEY_KP9; break; | |
1009 default: key = *[[theEvent characters] UTF8String]; break; | |
1010 } | |
1011 mplayer_put_key(key); | |
1012 } | |
1013 | |
1014 /* | |
1015 Process mouse button event | |
1016 */ | |
1017 - (void) mouseMoved: (NSEvent *) theEvent | |
1018 { | |
15327 | 1019 if(isFullscreen && !isRootwin) |
15289 | 1020 { |
18057 | 1021 CGDisplayShowCursor(kCGDirectMainDisplay); |
15289 | 1022 mouseHide = NO; |
1023 } | |
25468
a77c438fedf7
Do not send mouse movements events in root win mode.
ulion
parents:
25446
diff
changeset
|
1024 if (enable_mouse_movements && !isRootwin) { |
25446 | 1025 NSPoint p =[self convertPoint:[theEvent locationInWindow] fromView:nil]; |
1026 if ([self mouse:p inRect:textureFrame]) { | |
1027 char cmdstr[40]; | |
1028 snprintf(cmdstr, sizeof(cmdstr), "set_mouse_pos %i %i", | |
1029 (int)(vo_fs ? p.x : (p.x - textureFrame.origin.x)), | |
1030 (int)(vo_fs ? [self frame].size.height - p.y: (NSMaxY(textureFrame) - p.y))); | |
1031 mp_input_queue_cmd(mp_input_parse_cmd(cmdstr)); | |
1032 } | |
1033 } | |
15289 | 1034 } |
1035 | |
1036 - (void) mouseDown: (NSEvent *) theEvent | |
1037 { | |
1038 [self mouseEvent: theEvent]; | |
1039 } | |
1040 | |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1041 - (void) mouseUp: (NSEvent *) theEvent |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1042 { |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1043 [self mouseEvent: theEvent]; |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1044 } |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1045 |
15289 | 1046 - (void) rightMouseDown: (NSEvent *) theEvent |
1047 { | |
1048 [self mouseEvent: theEvent]; | |
1049 } | |
1050 | |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1051 - (void) rightMouseUp: (NSEvent *) theEvent |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1052 { |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1053 [self mouseEvent: theEvent]; |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1054 } |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1055 |
15289 | 1056 - (void) otherMouseDown: (NSEvent *) theEvent |
1057 { | |
1058 [self mouseEvent: theEvent]; | |
1059 } | |
1060 | |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1061 - (void) otherMouseUp: (NSEvent *) theEvent |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1062 { |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1063 [self mouseEvent: theEvent]; |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1064 } |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1065 |
15289 | 1066 - (void) scrollWheel: (NSEvent *) theEvent |
1067 { | |
1068 if([theEvent deltaY] > 0) | |
1069 mplayer_put_key(MOUSE_BTN3); | |
1070 else | |
1071 mplayer_put_key(MOUSE_BTN4); | |
1072 } | |
1073 | |
1074 - (void) mouseEvent: (NSEvent *) theEvent | |
1075 { | |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1076 if ( [theEvent buttonNumber] >= 0 && [theEvent buttonNumber] <= 9 ) |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1077 { |
25422 | 1078 int buttonNumber = [theEvent buttonNumber]; |
1079 // Fix to mplayer defined button order: left, middle, right | |
1080 if (buttonNumber == 1) | |
1081 buttonNumber = 2; | |
25423 | 1082 else if (buttonNumber == 2) |
1083 buttonNumber = 1; | |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1084 switch([theEvent type]) |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1085 { |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1086 case NSLeftMouseDown: |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1087 case NSRightMouseDown: |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1088 case NSOtherMouseDown: |
25422 | 1089 mplayer_put_key((MOUSE_BTN0 + buttonNumber) | MP_KEY_DOWN); |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1090 break; |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1091 case NSLeftMouseUp: |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1092 case NSRightMouseUp: |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1093 case NSOtherMouseUp: |
25422 | 1094 mplayer_put_key(MOUSE_BTN0 + buttonNumber); |
24077
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1095 break; |
9ce03980ed0c
added double click support in vo_macosx. Patch by Ulion <ulion2002@gmail.com>
nplourde
parents:
24076
diff
changeset
|
1096 } |
15289 | 1097 } |
1098 } | |
1099 | |
1100 /* | |
1101 NSResponder | |
1102 */ | |
1103 - (BOOL) acceptsFirstResponder | |
1104 { | |
1105 return YES; | |
1106 } | |
1107 | |
1108 - (BOOL) becomeFirstResponder | |
1109 { | |
1110 return YES; | |
1111 } | |
1112 | |
1113 - (BOOL) resignFirstResponder | |
1114 { | |
1115 return YES; | |
1116 } | |
15325 | 1117 |
1118 - (void)windowWillClose:(NSNotification *)aNotification | |
1119 { | |
21551 | 1120 mpGLView = NULL; |
15325 | 1121 mplayer_put_key(KEY_ESC); |
1122 } | |
1123 @end |