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