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