1 /*
2  * This file is part of MPlayer.
3  *
4  * MPlayer is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * MPlayer is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License along
15  * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17  */
18 #include "config.h"
19 
20 // only to get keycode definitions from HIToolbox/Events.h
21 #include <Carbon/Carbon.h>
22 #include "config.h"
23 #include "osx_common.h"
24 #include "video_out.h"
25 #include "osdep/keycodes.h"
26 #include "input/input.h"
27 
28 /*
29  * Define keycodes only found in OSX >= 10.5 for older versions
30  */
31 #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
32 #define kVK_ANSI_Keypad0 0x52
33 #define kVK_ANSI_Keypad1 0x53
34 #define kVK_ANSI_Keypad2 0x54
35 #define kVK_ANSI_Keypad3 0x55
36 #define kVK_ANSI_Keypad4 0x56
37 #define kVK_ANSI_Keypad5 0x57
38 #define kVK_ANSI_Keypad6 0x58
39 #define kVK_ANSI_Keypad7 0x59
40 #define kVK_ANSI_Keypad8 0x5b
41 #define kVK_ANSI_Keypad9 0x5c
42 #define kVK_ANSI_KeypadDecimal 0x41
43 #define kVK_ANSI_KeypadDivide 0x4b
44 #define kVK_ANSI_KeypadEnter 0x4c
45 #define kVK_ANSI_KeypadMinus 0x4e
46 #define kVK_ANSI_KeypadMultiply 0x43
47 #define kVK_ANSI_KeypadPlus 0x45
48 #define kVK_Control 0x3b
49 #define kVK_Delete 0x33
50 #define kVK_DownArrow 0x7d
51 #define kVK_End 0x77
52 #define kVK_Escape 0x35
53 #define kVK_F1 0x7a
54 #define kVK_F10 0x6d
55 #define kVK_F11 0x67
56 #define kVK_F12 0x6f
57 #define kVK_F2 0x78
58 #define kVK_F3 0x63
59 #define kVK_F4 0x76
60 #define kVK_F5 0x60
61 #define kVK_F6 0x61
62 #define kVK_F7 0x62
63 #define kVK_F8 0x64
64 #define kVK_F9 0x65
65 #define kVK_ForwardDelete 0x75
66 #define kVK_Help 0x72
67 #define kVK_Home 0x73
68 #define kVK_LeftArrow 0x7b
69 #define kVK_Option 0x3a
70 #define kVK_PageDown 0x79
71 #define kVK_PageUp 0x74
72 #define kVK_Return 0x24
73 #define kVK_RightArrow 0x7c
74 #define kVK_Shift 0x38
75 #define kVK_Tab 0x30
76 #define kVK_UpArrow 0x7e
77 #endif /* MAC_OS_X_VERSION_MAX_ALLOWED <= 1040 */
78 
79 static const struct mp_keymap keymap[] = {
80     // special keys
81     {0x34, KEY_ENTER}, // Enter key on some iBooks?
82     {kVK_Return, KEY_ENTER},
83     {kVK_Escape, KEY_ESC},
84     {kVK_Delete, KEY_BACKSPACE}, {kVK_Option, KEY_BACKSPACE}, {kVK_Control, KEY_BACKSPACE}, {kVK_Shift, KEY_BACKSPACE},
85     {kVK_Tab, KEY_TAB},
86 
87     // cursor keys
88     {kVK_UpArrow, KEY_UP}, {kVK_DownArrow, KEY_DOWN}, {kVK_LeftArrow, KEY_LEFT}, {kVK_RightArrow, KEY_RIGHT},
89 
90     // navigation block
91     {kVK_Help, KEY_INSERT}, {kVK_ForwardDelete, KEY_DELETE}, {kVK_Home, KEY_HOME},
92     {kVK_End, KEY_END}, {kVK_PageUp, KEY_PAGE_UP}, {kVK_PageDown, KEY_PAGE_DOWN},
93 
94     // F-keys
95     {kVK_F1, KEY_F + 1}, {kVK_F2, KEY_F + 2}, {kVK_F3, KEY_F + 3}, {kVK_F4, KEY_F + 4},
96     {kVK_F5, KEY_F + 5}, {kVK_F6, KEY_F + 6}, {kVK_F7, KEY_F + 7}, {kVK_F8, KEY_F + 8},
97     {kVK_F9, KEY_F + 9}, {kVK_F10, KEY_F + 10}, {kVK_F11, KEY_F + 11}, {kVK_F12, KEY_F + 12},
98 
99     // numpad
100     {kVK_ANSI_KeypadPlus, '+'}, {kVK_ANSI_KeypadMinus, '-'}, {kVK_ANSI_KeypadMultiply, '*'},
101     {kVK_ANSI_KeypadDivide, '/'}, {kVK_ANSI_KeypadEnter, KEY_KPENTER}, {kVK_ANSI_KeypadDecimal, KEY_KPDEC},
102     {kVK_ANSI_Keypad0, KEY_KP0}, {kVK_ANSI_Keypad1, KEY_KP1}, {kVK_ANSI_Keypad2, KEY_KP2}, {kVK_ANSI_Keypad3, KEY_KP3},
103     {kVK_ANSI_Keypad4, KEY_KP4}, {kVK_ANSI_Keypad5, KEY_KP5}, {kVK_ANSI_Keypad6, KEY_KP6}, {kVK_ANSI_Keypad7, KEY_KP7},
104     {kVK_ANSI_Keypad8, KEY_KP8}, {kVK_ANSI_Keypad9, KEY_KP9},
105 
106     {0, 0}
107 };
108 
convert_key(unsigned key,unsigned charcode)109 int convert_key(unsigned key, unsigned charcode)
110 {
111     int mpkey = lookup_keymap_table(keymap, key);
112     if (mpkey)
113         return mpkey;
114     return charcode;
115 }
116 
117 static int our_aspect_change;
118 static float old_movie_aspect;
119 
120 /**
121  * Sends MPlayer a command to change aspect to the requested value.
122  * @param new_aspect desired new aspect, < 0 means restore original.
123  */
change_movie_aspect(float new_aspect)124 void change_movie_aspect(float new_aspect)
125 {
126     char cmd_str[64];
127     if (new_aspect < 0)
128         new_aspect = old_movie_aspect;
129     our_aspect_change = 1;
130     snprintf(cmd_str, sizeof(cmd_str), "switch_ratio %f", new_aspect);
131     mp_input_queue_cmd(mp_input_parse_cmd(cmd_str));
132 }
133 
134 /**
135  * Call in config to save the original movie aspect.
136  * This will ignore config calls caused by change_movie_aspect.
137  */
config_movie_aspect(float config_aspect)138 void config_movie_aspect(float config_aspect)
139 {
140     if (!our_aspect_change)
141         old_movie_aspect = config_aspect;
142     our_aspect_change = 0;
143 }
144 
145 /** This chunk of code is heavily based off SDL_macosx.m from SDL.
146  *  The CPSEnableForegroundOperation that was here before is private
147  *  and should not be used.
148  *  Replaced by a call to the 10.3+ TransformProcessType.
149  */
osx_foreground_hack(void)150 void osx_foreground_hack(void)
151 {
152 #if !defined (CONFIG_MACOSX_FINDER) || !defined (CONFIG_SDL)
153     ProcessSerialNumber myProc, frProc;
154     Boolean sameProc;
155 
156     if (GetFrontProcess(&frProc)   == noErr &&
157         GetCurrentProcess(&myProc) == noErr) {
158         if (SameProcess(&frProc, &myProc, &sameProc) == noErr && !sameProc) {
159             TransformProcessType(&myProc,
160                                  kProcessTransformToForegroundApplication);
161         }
162         SetFrontProcess(&myProc);
163     }
164 #endif
165 }
166