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