summaryrefslogtreecommitdiffstats
path: root/video
diff options
context:
space:
mode:
authorStefano Pigozzi <stefano.pigozzi@gmail.com>2013-06-02 17:39:05 +0200
committerStefano Pigozzi <stefano.pigozzi@gmail.com>2013-06-03 22:31:13 +0200
commitf13f0db33a18040e660b6ed76ad43d1870f096a2 (patch)
tree5eb21b606796f0bcd984dd0252666307883c4c49 /video
parent63e2a21c644dad53f5fc256a2d00aef6b171f17c (diff)
downloadmpv-f13f0db33a18040e660b6ed76ad43d1870f096a2.tar.bz2
mpv-f13f0db33a18040e660b6ed76ad43d1870f096a2.tar.xz
osx: create macosx_events to deal with keyDown events
On OSX with Cocoa enabled keyDown events are now handled with addLocalMonitorForEventsMatchingMask:handler:. This allows to respond to events even when there is no VO initialized but the GUI is focused.
Diffstat (limited to 'video')
-rw-r--r--video/out/cocoa_common.m115
-rw-r--r--video/out/osx_common.c64
-rw-r--r--video/out/osx_common.h24
3 files changed, 9 insertions, 194 deletions
diff --git a/video/out/cocoa_common.m b/video/out/cocoa_common.m
index 28dbf58923..8c57ce53dc 100644
--- a/video/out/cocoa_common.m
+++ b/video/out/cocoa_common.m
@@ -34,27 +34,10 @@
#include "core/mp_fifo.h"
#include "talloc.h"
-#include "core/input/input.h"
-#include "core/input/keycodes.h"
-#include "osx_common.h"
#include "core/mp_msg.h"
#include "osdep/macosx_application.h"
-
-#define NSLeftAlternateKeyMask (0x000020 | NSAlternateKeyMask)
-#define NSRightAlternateKeyMask (0x000040 | NSAlternateKeyMask)
-
-static bool LeftAltPressed(NSEvent *event)
-{
- return ([event modifierFlags] & NSLeftAlternateKeyMask) ==
- NSLeftAlternateKeyMask;
-}
-
-static bool RightAltPressed(NSEvent *event)
-{
- return ([event modifierFlags] & NSRightAlternateKeyMask) ==
- NSRightAlternateKeyMask;
-}
+#include "osdep/macosx_events.h"
@interface GLMPlayerWindow : NSWindow <NSWindowDelegate>
- (BOOL)canBecomeKeyWindow;
@@ -79,48 +62,6 @@ static bool RightAltPressed(NSEvent *event)
- (BOOL)hasMenubar;
@end
-struct vo_cocoa_input_queue {
- NSMutableArray *fifo;
-};
-
-static int vo_cocoa_input_queue_free(void *ptr)
-{
- struct vo_cocoa_input_queue *iq = ptr;
- [iq->fifo release];
- return 0;
-}
-
-static struct vo_cocoa_input_queue *vo_cocoa_input_queue_init(void *talloc_ctx)
-{
- struct vo_cocoa_input_queue *iq = talloc_ptrtype(talloc_ctx, iq);
- *iq = (struct vo_cocoa_input_queue) {
- .fifo = [[NSMutableArray alloc] init],
- };
- talloc_set_destructor(iq, vo_cocoa_input_queue_free);
- return iq;
-}
-
-static void cocoa_async_put_key(struct vo_cocoa_input_queue *iq, int key)
-{
- @synchronized (iq->fifo) {
- [iq->fifo addObject:[NSNumber numberWithInt:key]];
- }
-}
-
-static int cocoa_sync_get_key(struct vo_cocoa_input_queue *iq)
-{
- int r = -1;
-
- @synchronized (iq->fifo) {
- if ([iq->fifo count] > 0) {
- r = [[iq->fifo objectAtIndex:0] intValue];
- [iq->fifo removeObjectAtIndex:0];
- }
- }
-
- return r;
-}
-
struct vo_cocoa_state {
GLMPlayerWindow *window;
GLMPlayerOpenGLView *view;
@@ -148,8 +89,6 @@ struct vo_cocoa_state {
NSLock *lock;
bool enable_resize_redraw;
void (*resize_redraw)(struct vo *vo, int w, int h);
-
- struct vo_cocoa_input_queue *input_queue;
};
static struct vo_cocoa_state *vo_cocoa_init_state(struct vo *vo)
@@ -164,7 +103,6 @@ static struct vo_cocoa_state *vo_cocoa_init_state(struct vo *vo)
.power_mgmt_assertion = kIOPMNullAssertionID,
.accumulated_scroll = 0,
.lock = [[NSLock alloc] init],
- .input_queue = vo_cocoa_input_queue_init(s),
.enable_resize_redraw = NO,
};
return s;
@@ -568,9 +506,6 @@ int vo_cocoa_check_events(struct vo *vo)
{
struct vo_cocoa_state *s = vo->cocoa;
- int key = cocoa_sync_get_key(s->input_queue);
- if (key >= 0) mplayer_put_key(vo->key_fifo, key);
-
if (s->did_resize) {
s->did_resize = NO;
resize_window(vo);
@@ -762,8 +697,7 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
- (BOOL)canBecomeKeyWindow { return YES; }
- (BOOL)windowShouldClose:(id)sender
{
- struct vo_cocoa_state *s = self.videoOutput->cocoa;
- cocoa_async_put_key(s->input_queue, MP_KEY_CLOSE_WIN);
+ cocoa_put_key(MP_KEY_CLOSE_WIN);
// We have to wait for MPlayer to handle this,
// otherwise we are in trouble if the
// MP_KEY_CLOSE_WIN handler is disabled
@@ -867,32 +801,6 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
- (BOOL)becomeFirstResponder { return YES; }
- (BOOL)resignFirstResponder { return YES; }
- - (void)keyDown:(NSEvent *)theEvent
-{
- struct vo_cocoa_state *s = self.videoOutput->cocoa;
- NSString *chars;
-
- if (RightAltPressed(theEvent))
- chars = [theEvent characters];
- else
- chars = [theEvent charactersIgnoringModifiers];
-
- int key = convert_key([theEvent keyCode], *[chars UTF8String]);
-
- if (key > -1) {
- if ([theEvent modifierFlags] & NSShiftKeyMask)
- key |= MP_KEY_MODIFIER_SHIFT;
- if ([theEvent modifierFlags] & NSControlKeyMask)
- key |= MP_KEY_MODIFIER_CTRL;
- if (LeftAltPressed(theEvent))
- key |= MP_KEY_MODIFIER_ALT;
- if ([theEvent modifierFlags] & NSCommandKeyMask)
- key |= MP_KEY_MODIFIER_META;
-
- cocoa_async_put_key(s->input_queue, key);
- }
-}
-
- (NSPoint) mouseLocation
{
NSPoint mLoc = [NSEvent mouseLocation];
@@ -946,24 +854,23 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
static const CGFloat threshold = 10;
while (s->accumulated_scroll >= threshold) {
s->accumulated_scroll -= threshold;
- cocoa_async_put_key(s->input_queue, MP_MOUSE_BTN3);
+ cocoa_put_key(MP_MOUSE_BTN3);
}
while (s->accumulated_scroll <= -threshold) {
s->accumulated_scroll += threshold;
- cocoa_async_put_key(s->input_queue, MP_MOUSE_BTN4);
+ cocoa_put_key(MP_MOUSE_BTN4);
}
} else {
if (delta > 0)
- cocoa_async_put_key(s->input_queue, MP_MOUSE_BTN3);
+ cocoa_put_key(MP_MOUSE_BTN3);
else
- cocoa_async_put_key(s->input_queue, MP_MOUSE_BTN4);
+ cocoa_put_key(MP_MOUSE_BTN4);
}
}
- (void)mouseEvent:(NSEvent *)theEvent
{
if ([theEvent buttonNumber] >= 0 && [theEvent buttonNumber] <= 9) {
- struct vo_cocoa_state *s = self.videoOutput->cocoa;
int buttonNumber = [theEvent buttonNumber];
// Fix to mplayer defined button order: left, middle, right
if (buttonNumber == 1) buttonNumber = 2;
@@ -972,24 +879,20 @@ int vo_cocoa_cgl_color_size(struct vo *vo)
case NSLeftMouseDown:
case NSRightMouseDown:
case NSOtherMouseDown:
- cocoa_async_put_key(
- s->input_queue,
- (MP_MOUSE_BTN0 + buttonNumber) | MP_KEY_STATE_DOWN);
+ cocoa_put_key((MP_MOUSE_BTN0 + buttonNumber) | MP_KEY_STATE_DOWN);
self.mouseDown = YES;
// Looks like Cocoa doesn't create MouseUp events when we are
// doing the second click in a double click. Put in the key_fifo
// the key that would be put from the MouseUp handling code.
if([theEvent clickCount] == 2) {
- cocoa_async_put_key(s->input_queue,
- MP_MOUSE_BTN0 + buttonNumber);
+ cocoa_put_key(MP_MOUSE_BTN0 + buttonNumber);
self.mouseDown = NO;
}
break;
case NSLeftMouseUp:
case NSRightMouseUp:
case NSOtherMouseUp:
- cocoa_async_put_key(s->input_queue,
- MP_MOUSE_BTN0 + buttonNumber);
+ cocoa_put_key(MP_MOUSE_BTN0 + buttonNumber);
self.mouseDown = NO;
break;
}
diff --git a/video/out/osx_common.c b/video/out/osx_common.c
deleted file mode 100644
index a81217aace..0000000000
--- a/video/out/osx_common.c
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-#include "config.h"
-
-// only to get keycode definitions from HIToolbox/Events.h
-#include <Carbon/Carbon.h>
-#include <CoreServices/CoreServices.h>
-#include "osx_common.h"
-#include "video/out/vo.h"
-#include "core/input/keycodes.h"
-#include "core/input/input.h"
-#include "core/mp_msg.h"
-
-static const struct mp_keymap keymap[] = {
- // special keys
- {kVK_Return, MP_KEY_ENTER},
- {kVK_Escape, MP_KEY_ESC},
- {kVK_Delete, MP_KEY_BACKSPACE}, {kVK_Option, MP_KEY_BACKSPACE}, {kVK_Control, MP_KEY_BACKSPACE}, {kVK_Shift, MP_KEY_BACKSPACE},
- {kVK_Tab, MP_KEY_TAB},
-
- // cursor keys
- {kVK_UpArrow, MP_KEY_UP}, {kVK_DownArrow, MP_KEY_DOWN}, {kVK_LeftArrow, MP_KEY_LEFT}, {kVK_RightArrow, MP_KEY_RIGHT},
-
- // navigation block
- {kVK_Help, MP_KEY_INSERT}, {kVK_ForwardDelete, MP_KEY_DELETE}, {kVK_Home, MP_KEY_HOME},
- {kVK_End, MP_KEY_END}, {kVK_PageUp, MP_KEY_PAGE_UP}, {kVK_PageDown, MP_KEY_PAGE_DOWN},
-
- // F-keys
- {kVK_F1, MP_KEY_F + 1}, {kVK_F2, MP_KEY_F + 2}, {kVK_F3, MP_KEY_F + 3}, {kVK_F4, MP_KEY_F + 4},
- {kVK_F5, MP_KEY_F + 5}, {kVK_F6, MP_KEY_F + 6}, {kVK_F7, MP_KEY_F + 7}, {kVK_F8, MP_KEY_F + 8},
- {kVK_F9, MP_KEY_F + 9}, {kVK_F10, MP_KEY_F + 10}, {kVK_F11, MP_KEY_F + 11}, {kVK_F12, MP_KEY_F + 12},
-
- // numpad
- {kVK_ANSI_KeypadPlus, '+'}, {kVK_ANSI_KeypadMinus, '-'}, {kVK_ANSI_KeypadMultiply, '*'},
- {kVK_ANSI_KeypadDivide, '/'}, {kVK_ANSI_KeypadEnter, MP_KEY_KPENTER}, {kVK_ANSI_KeypadDecimal, MP_KEY_KPDEC},
- {kVK_ANSI_Keypad0, MP_KEY_KP0}, {kVK_ANSI_Keypad1, MP_KEY_KP1}, {kVK_ANSI_Keypad2, MP_KEY_KP2}, {kVK_ANSI_Keypad3, MP_KEY_KP3},
- {kVK_ANSI_Keypad4, MP_KEY_KP4}, {kVK_ANSI_Keypad5, MP_KEY_KP5}, {kVK_ANSI_Keypad6, MP_KEY_KP6}, {kVK_ANSI_Keypad7, MP_KEY_KP7},
- {kVK_ANSI_Keypad8, MP_KEY_KP8}, {kVK_ANSI_Keypad9, MP_KEY_KP9},
-
- {0, 0}
-};
-
-int convert_key(unsigned key, unsigned charcode)
-{
- int mpkey = lookup_keymap_table(keymap, key);
- if (mpkey)
- return mpkey;
- return charcode;
-}
diff --git a/video/out/osx_common.h b/video/out/osx_common.h
deleted file mode 100644
index 3c4855fde3..0000000000
--- a/video/out/osx_common.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * This file is part of MPlayer.
- *
- * MPlayer is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * MPlayer is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with MPlayer; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef MPLAYER_OSX_COMMON_H
-#define MPLAYER_OSX_COMMON_H
-
-int convert_key(unsigned key, unsigned charcode);
-
-#endif /* MPLAYER_OSX_COMMON_H */