summaryrefslogtreecommitdiffstats
path: root/libvo
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2008-12-22 00:46:02 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2008-12-22 00:46:02 +0200
commitfccb0a7e45b61128262a396f2426bd7168fd198c (patch)
treeac09e6b90d4389717f32181f8b6f3848ffb149fe /libvo
parent71b25cca7644ab059393e9ee4682d79aab41ceba (diff)
parentce821bd91f0b0c67b96f5d3b8f3fda19e1015294 (diff)
downloadmpv-fccb0a7e45b61128262a396f2426bd7168fd198c.tar.bz2
mpv-fccb0a7e45b61128262a396f2426bd7168fd198c.tar.xz
Merge svn changes up to r28176
Conflicts: libvo/video_out.c libvo/x11_common.c
Diffstat (limited to 'libvo')
-rw-r--r--libvo/video_out.c67
-rw-r--r--libvo/video_out.h6
-rw-r--r--libvo/vo_macosx.m46
-rw-r--r--libvo/w32_common.c34
-rw-r--r--libvo/wskeys.h88
-rw-r--r--libvo/x11_common.c333
6 files changed, 146 insertions, 428 deletions
diff --git a/libvo/video_out.c b/libvo/video_out.c
index e587932959..dfdebf077e 100644
--- a/libvo/video_out.c
+++ b/libvo/video_out.c
@@ -49,7 +49,7 @@ char *vo_subdevice = NULL;
int vo_directrendering=0;
int vo_colorkey = 0x0000ff00; // default colorkey is green
- // (0xff000000 means that colorkey has been disabled)
+ // (0xff000000 means that colorkey has been disabled)
//
// Externally visible list of all vo drivers
@@ -118,10 +118,10 @@ const struct vo_driver *video_out_drivers[] =
&video_out_direct3d,
#endif
#ifdef CONFIG_COREVIDEO
- &video_out_macosx,
+ &video_out_macosx,
#endif
#ifdef CONFIG_QUARTZ
- &video_out_quartz,
+ &video_out_quartz,
#endif
#ifdef CONFIG_XMGA
&video_out_xmga,
@@ -159,26 +159,26 @@ const struct vo_driver *video_out_drivers[] =
&video_out_sdl,
#endif
#ifdef CONFIG_GGI
- &video_out_ggi,
+ &video_out_ggi,
#endif
#ifdef CONFIG_FBDEV
- &video_out_fbdev,
- &video_out_fbdev2,
+ &video_out_fbdev,
+ &video_out_fbdev2,
#endif
#ifdef CONFIG_SVGALIB
- &video_out_svga,
+ &video_out_svga,
#endif
#ifdef CONFIG_AA
- &video_out_aa,
+ &video_out_aa,
#endif
#ifdef CONFIG_CACA
- &video_out_caca,
+ &video_out_caca,
#endif
#ifdef CONFIG_DXR2
- &video_out_dxr2,
+ &video_out_dxr2,
#endif
#ifdef CONFIG_DXR3
- &video_out_dxr3,
+ &video_out_dxr3,
#endif
#ifdef CONFIG_IVTV
&video_out_ivtv,
@@ -187,56 +187,56 @@ const struct vo_driver *video_out_drivers[] =
&video_out_v4l2,
#endif
#ifdef CONFIG_ZR
- &video_out_zr,
- &video_out_zr2,
+ &video_out_zr,
+ &video_out_zr2,
#endif
#ifdef CONFIG_BL
- &video_out_bl,
+ &video_out_bl,
#endif
#ifdef CONFIG_VESA
- &video_out_vesa,
+ &video_out_vesa,
#endif
#ifdef CONFIG_DIRECTFB
- &video_out_directfb,
+ &video_out_directfb,
#endif
#ifdef CONFIG_DFBMGA
&video_out_dfbmga,
#endif
#ifdef CONFIG_VIDIX
#ifdef CONFIG_X11
- &video_out_xvidix,
+ &video_out_xvidix,
#endif
#if defined(__MINGW32__) || defined(__CYGWIN__)
- &video_out_winvidix,
+ &video_out_winvidix,
#endif
- &video_out_cvidix,
+ &video_out_cvidix,
#endif
&video_out_null,
- // should not be auto-selected
+ // should not be auto-selected
#ifdef CONFIG_XVMC
&video_out_xvmc,
#endif
- &video_out_mpegpes,
+ &video_out_mpegpes,
#ifdef CONFIG_YUV4MPEG
- &video_out_yuv4mpeg,
+ &video_out_yuv4mpeg,
#endif
#ifdef CONFIG_PNG
- &video_out_png,
+ &video_out_png,
#endif
#ifdef CONFIG_JPEG
- &video_out_jpeg,
+ &video_out_jpeg,
#endif
#ifdef CONFIG_GIF
- &video_out_gif89a,
+ &video_out_gif89a,
#endif
#ifdef CONFIG_TGA
&video_out_tga,
#endif
#ifdef CONFIG_PNM
- &video_out_pnm,
+ &video_out_pnm,
#endif
#ifdef CONFIG_MD5SUM
- &video_out_md5sum,
+ &video_out_md5sum,
#endif
NULL
};
@@ -389,7 +389,18 @@ int vo_config(struct vo *vo, uint32_t width, uint32_t height,
return ret;
}
-#if defined(CONFIG_FBDEV)||defined(CONFIG_VESA)
+/**
+ * \brief lookup an integer in a table, table must have 0 as the last key
+ * \param key key to search for
+ * \result translation corresponding to key or "to" value of last mapping
+ * if not found.
+ */
+int lookup_keymap_table(const struct keymap *map, int key) {
+ while (map->from && map->from != key) map++;
+ return map->to;
+}
+
+#if defined(CONFIG_FBDEV) || defined(CONFIG_VESA)
/* Borrowed from vo_fbdev.c
Monitor ranges related functions*/
diff --git a/libvo/video_out.h b/libvo/video_out.h
index cc9544f4fb..465697927f 100644
--- a/libvo/video_out.h
+++ b/libvo/video_out.h
@@ -298,4 +298,10 @@ extern char *monitor_hfreq_str;
extern char *monitor_vfreq_str;
extern char *monitor_dotclock_str;
+struct keymap {
+ int from;
+ int to;
+};
+int lookup_keymap_table(const struct keymap *map, int key);
+
#endif /* MPLAYER_VIDEO_OUT_H */
diff --git a/libvo/vo_macosx.m b/libvo/vo_macosx.m
index 24ffdc1e1f..83537e70c6 100644
--- a/libvo/vo_macosx.m
+++ b/libvo/vo_macosx.m
@@ -28,6 +28,7 @@
#include "m_option.h"
#include "mp_fifo.h"
#include "libvo/sub.h"
+#include "subopt-helper.h"
#include "input/input.h"
#include "input/mouse.h"
@@ -314,30 +315,31 @@ static void uninit(void)
}
}
+static opt_t subopts[] = {
+{"device_id", OPT_ARG_INT, &screen_id, (opt_test_f)int_non_neg},
+{"shared_buffer", OPT_ARG_BOOL, &shared_buffer, NULL},
+{NULL}
+};
+
static int preinit(const char *arg)
{
- int parse_err = 0;
-
- if(arg)
- {
- char *parse_pos = (char *)&arg[0];
- while (parse_pos[0] && !parse_err)
- {
- if (strncmp (parse_pos, "device_id=", 10) == 0)
- {
- parse_pos = &parse_pos[10];
- screen_id = strtol(parse_pos, &parse_pos, 0);
- screen_force = YES;
- }
- if (strncmp (parse_pos, "shared_buffer", 13) == 0)
- {
- parse_pos = &parse_pos[13];
- shared_buffer = YES;
- }
- if (parse_pos[0] == ':') parse_pos = &parse_pos[1];
- else if (parse_pos[0]) parse_err = 1;
- }
- }
+
+ // set defaults
+ screen_id = 0;
+ shared_buffer = false;
+
+ if (subopt_parse(arg, subopts) != 0) {
+ mp_msg(MSGT_VO, MSGL_FATAL,
+ "\n-vo macosx command line help:\n"
+ "Example: mplayer -vo macosx:device_id=1:shared_buffer\n"
+ "\nOptions:\n"
+ " device_id=<0-...>\n"
+ " Set screen device id for fullscreen.\n"
+ " shared_buffer\n"
+ " Write output to a shared memory buffer instead of displaying it.\n"
+ "\n" );
+ return -1;
+ }
NSApplicationLoad();
autoreleasepool = [[NSAutoreleasePool alloc] init];
diff --git a/libvo/w32_common.c b/libvo/w32_common.c
index c2502d3f47..e51fd6d2c0 100644
--- a/libvo/w32_common.c
+++ b/libvo/w32_common.c
@@ -43,9 +43,24 @@ static HMONITOR (WINAPI* myMonitorFromWindow)(HWND, DWORD);
static BOOL (WINAPI* myGetMonitorInfo)(HMONITOR, LPMONITORINFO);
static BOOL (WINAPI* myEnumDisplayMonitors)(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
+static const struct keymap vk_map[] = {
+ // special keys
+ {VK_ESCAPE, KEY_ESC}, {VK_BACK, KEY_BS}, {VK_TAB, KEY_TAB}, {VK_CONTROL, KEY_CTRL},
+
+ // cursor keys
+ {VK_LEFT, KEY_LEFT}, {VK_UP, KEY_UP}, {VK_RIGHT, KEY_RIGHT}, {VK_DOWN, KEY_DOWN},
+
+ // navigation block
+ {VK_INSERT, KEY_INSERT}, {VK_DELETE, KEY_DELETE}, {VK_HOME, KEY_HOME}, {VK_END, KEY_END},
+ {VK_PRIOR, KEY_PAGE_UP}, {VK_NEXT, KEY_PAGE_DOWN},
+
+ {0, 0}
+};
+
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
RECT r;
POINT p;
+ int mpkey;
switch (message) {
case WM_ERASEBKGND: // no need to erase background seperately
return 1;
@@ -91,22 +106,9 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM l
}
break;
case WM_KEYDOWN:
- switch (wParam) {
- case VK_LEFT: mplayer_put_key(KEY_LEFT); break;
- case VK_UP: mplayer_put_key(KEY_UP); break;
- case VK_RIGHT: mplayer_put_key(KEY_RIGHT); break;
- case VK_DOWN: mplayer_put_key(KEY_DOWN); break;
- case VK_TAB: mplayer_put_key(KEY_TAB); break;
- case VK_CONTROL: mplayer_put_key(KEY_CTRL); break;
- case VK_BACK: mplayer_put_key(KEY_BS); break;
- case VK_DELETE: mplayer_put_key(KEY_DELETE); break;
- case VK_INSERT: mplayer_put_key(KEY_INSERT); break;
- case VK_HOME: mplayer_put_key(KEY_HOME); break;
- case VK_END: mplayer_put_key(KEY_END); break;
- case VK_PRIOR: mplayer_put_key(KEY_PAGE_UP); break;
- case VK_NEXT: mplayer_put_key(KEY_PAGE_DOWN); break;
- case VK_ESCAPE: mplayer_put_key(KEY_ESC); break;
- }
+ mpkey = lookup_keymap_table(vk_map, wParam);
+ if (mpkey)
+ mplayer_put_key(mpkey);
break;
case WM_CHAR:
mplayer_put_key(wParam);
diff --git a/libvo/wskeys.h b/libvo/wskeys.h
index f226ccc2e9..31d650d63f 100644
--- a/libvo/wskeys.h
+++ b/libvo/wskeys.h
@@ -2,94 +2,6 @@
#ifndef MPLAYER_WSKEYS_H
#define MPLAYER_WSKEYS_H
-#define wsosbrackets '['
-#define wscsbrackets ']'
-
-#define wsq 'q'
-#define wsa 'a'
-#define wsz 'z'
-#define wsw 'w'
-#define wss 's'
-#define wsx 'x'
-#define wse 'e'
-#define wsd 'd'
-#define wsr 'r'
-#define wsf 'f'
-#define wsv 'v'
-#define wst 't'
-#define wsg 'g'
-#define wsb 'b'
-#define wsy 'y'
-#define wsh 'h'
-#define wsn 'n'
-#define wsu 'u'
-#define wsj 'j'
-#define wsm 'm'
-#define wsi 'i'
-#define wsk 'k'
-#define wso 'o'
-#define wsl 'l'
-#define wsp 'p'
-
-#define wsQ 'Q'
-#define wsA 'A'
-#define wsZ 'Z'
-#define wsW 'W'
-#define wsS 'S'
-#define wsX 'X'
-#define wsE 'E'
-#define wsD 'D'
-#define wsR 'R'
-#define wsF 'F'
-#define wsV 'V'
-#define wsT 'T'
-#define wsG 'G'
-#define wsB 'B'
-#define wsY 'Y'
-#define wsH 'H'
-#define wsN 'N'
-#define wsU 'U'
-#define wsJ 'J'
-#define wsM 'M'
-#define wsI 'I'
-#define wsK 'K'
-#define wsO 'O'
-#define wsL 'L'
-#define wsP 'P'
-
-#define wsSpace ' '
-#define wsMinus '-'
-#define wsPlus '+'
-#define wsMul '*'
-#define wsDiv '/'
-#define wsLess '<'
-#define wsMore '>'
-
-#define wsGrave '`'
-#define wsTilde '~'
-#define wsExclSign '!'
-#define wsAt '@'
-#define wsHash '#'
-#define wsDollar '$'
-#define wsPercent '%'
-#define wsCircumflex '^'
-#define wsAmpersand '&'
-#define wsobracket '('
-#define wscbracket ')'
-#define wsUnder '_'
-#define wsocbracket '{'
-#define wsccbracket '}'
-#define wsColon ':'
-#define wsSemicolon ';'
-#define wsDblQuote '\"'
-#define wsAcute '\''
-#define wsComma ','
-#define wsPoint '.'
-#define wsQuestSign '?'
-#define wsBSlash '\\'
-#define wsPipe '|'
-#define wsEqual '='
-
#define wsUp 0x52 + 256
#define wsDown 0x54 + 256
#define wsLeft 0x51 + 256
diff --git a/libvo/x11_common.c b/libvo/x11_common.c
index 2dc594419a..9e6e31bd59 100644
--- a/libvo/x11_common.c
+++ b/libvo/x11_common.c
@@ -522,289 +522,74 @@ void vo_uninit(struct vo_x11_state *x11)
#include "wskeys.h"
#ifdef XF86XK_AudioPause
+static const struct keymap keysym_map[] = {
+ {XF86XK_MenuKB, KEY_MENU},
+ {XF86XK_AudioPlay, KEY_PLAY}, {XF86XK_AudioPause, KEY_PAUSE}, {XF86XK_AudioStop, KEY_STOP},
+ {XF86XK_AudioPrev, KEY_PREV}, {XF86XK_AudioNext, KEY_NEXT},
+ {XF86XK_AudioMute, KEY_MUTE}, {XF86XK_AudioLowerVolume, KEY_VOLUME_DOWN}, {XF86XK_AudioRaiseVolume, KEY_VOLUME_UP},
+ {0, 0}
+};
+
static void vo_x11_putkey_ext(struct vo *vo, int keysym)
{
struct mp_fifo *f = vo->key_fifo;
- switch (keysym)
- {
- case XF86XK_MenuKB:
- mplayer_put_key(f, KEY_MENU);
- break;
- case XF86XK_AudioPlay:
- mplayer_put_key(f, KEY_PLAY);
- break;
- case XF86XK_AudioPause:
- mplayer_put_key(f, KEY_PAUSE);
- break;
- case XF86XK_AudioStop:
- mplayer_put_key(f, KEY_STOP);
- break;
- case XF86XK_AudioPrev:
- mplayer_put_key(f, KEY_PREV);
- break;
- case XF86XK_AudioNext:
- mplayer_put_key(f, KEY_NEXT);
- break;
- case XF86XK_AudioMute:
- mplayer_put_key(f, KEY_MUTE);
- break;
- case XF86XK_AudioLowerVolume:
- mplayer_put_key(f, KEY_VOLUME_DOWN);
- break;
- case XF86XK_AudioRaiseVolume:
- mplayer_put_key(f, KEY_VOLUME_UP);
- break;
- default:
- break;
- }
+ int mpkey = lookup_keymap_table(keysym_map, keysym);
+ if (mpkey)
+ mplayer_put_key(f, mpkey);
}
#endif
+static const struct keymap keymap[] = {
+ // special keys
+ {wsEscape, KEY_ESC}, {wsBackSpace, KEY_BS}, {wsTab, KEY_TAB}, {wsEnter, KEY_ENTER},
+
+ // cursor keys
+ {wsLeft, KEY_LEFT}, {wsRight, KEY_RIGHT}, {wsUp, KEY_UP}, {wsDown, KEY_DOWN},
+
+ // navigation block
+ {wsInsert, KEY_INSERT}, {wsDelete, KEY_DELETE}, {wsHome, KEY_HOME}, {wsEnd, KEY_END},
+ {wsPageUp, KEY_PAGE_UP}, {wsPageDown, KEY_PAGE_DOWN},
+
+ // F-keys
+ {wsF1, KEY_F+1}, {wsF2, KEY_F+2}, {wsF3, KEY_F+3}, {wsF4, KEY_F+4},
+ {wsF5, KEY_F+5}, {wsF6, KEY_F+6}, {wsF7, KEY_F+7}, {wsF8, KEY_F+8},
+ {wsF9, KEY_F+9}, {wsF10, KEY_F+10}, {wsF11, KEY_F+11}, {wsF12, KEY_F+12},
+
+ // numpad independent of numlock
+ {wsGrayMinus, '-'}, {wsGrayPlus, '+'}, {wsGrayMul, '*'}, {wsGrayDiv, '/'},
+ {wsGrayEnter, KEY_KPENTER},
+
+ // numpad with numlock
+ {wsGray0, KEY_KP0}, {wsGray1, KEY_KP1}, {wsGray2, KEY_KP2},
+ {wsGray3, KEY_KP3}, {wsGray4, KEY_KP4}, {wsGray5, KEY_KP5},
+ {wsGray6, KEY_KP6}, {wsGray7, KEY_KP7}, {wsGray8, KEY_KP8},
+ {wsGray9, KEY_KP9}, {wsGrayDecimal, KEY_KPDEC},
+
+ // numpad without numlock
+ {wsGrayInsert, KEY_KPINS}, {wsGrayEnd, KEY_KP1}, {wsGrayDown, KEY_KP2},
+ {wsGrayPgDn, KEY_KP3}, {wsGrayLeft, KEY_KP4}, {wsGray5Dup, KEY_KP5},
+ {wsGrayRight, KEY_KP6}, {wsGrayHome, KEY_KP7}, {wsGrayUp, KEY_KP8},
+ {wsGrayPgUp, KEY_KP9}, {wsGrayDelete, KEY_KPDEL},
+
+ {0, 0}
+};
+
void vo_x11_putkey(struct vo *vo, int key)
{
- struct mp_fifo *f = vo->key_fifo;
- switch (key)
- {
- case wsLeft:
- mplayer_put_key(f, KEY_LEFT);
- break;
- case wsRight:
- mplayer_put_key(f, KEY_RIGHT);
- break;
- case wsUp:
- mplayer_put_key(f, KEY_UP);
- break;
- case wsDown:
- mplayer_put_key(f, KEY_DOWN);
- break;
- case wsSpace:
- mplayer_put_key(f, ' ');
- break;
- case wsEscape:
- mplayer_put_key(f, KEY_ESC);
- break;
- case wsTab:
- mplayer_put_key(f, KEY_TAB);
- break;
- case wsEnter:
- mplayer_put_key(f, KEY_ENTER);
- break;
- case wsBackSpace:
- mplayer_put_key(f, KEY_BS);
- break;
- case wsDelete:
- mplayer_put_key(f, KEY_DELETE);
- break;
- case wsInsert:
- mplayer_put_key(f, KEY_INSERT);
- break;
- case wsHome:
- mplayer_put_key(f, KEY_HOME);
- break;
- case wsEnd:
- mplayer_put_key(f, KEY_END);
- break;
- case wsPageUp:
- mplayer_put_key(f, KEY_PAGE_UP);
- break;
- case wsPageDown:
- mplayer_put_key(f, KEY_PAGE_DOWN);
- break;
- case wsF1:
- mplayer_put_key(f, KEY_F + 1);
- break;
- case wsF2:
- mplayer_put_key(f, KEY_F + 2);
- break;
- case wsF3:
- mplayer_put_key(f, KEY_F + 3);
- break;
- case wsF4:
- mplayer_put_key(f, KEY_F + 4);
- break;
- case wsF5:
- mplayer_put_key(f, KEY_F + 5);
- break;
- case wsF6:
- mplayer_put_key(f, KEY_F + 6);
- break;
- case wsF7:
- mplayer_put_key(f, KEY_F + 7);
- break;
- case wsF8:
- mplayer_put_key(f, KEY_F + 8);
- break;
- case wsF9:
- mplayer_put_key(f, KEY_F + 9);
- break;
- case wsF10:
- mplayer_put_key(f, KEY_F + 10);
- break;
- case wsF11:
- mplayer_put_key(f, KEY_F + 11);
- break;
- case wsF12:
- mplayer_put_key(f, KEY_F + 12);
- break;
- case wsMinus:
- case wsGrayMinus:
- mplayer_put_key(f, '-');
- break;
- case wsPlus:
- case wsGrayPlus:
- mplayer_put_key(f, '+');
- break;
- case wsGrayMul:
- case wsMul:
- mplayer_put_key(f, '*');
- break;
- case wsGrayDiv:
- case wsDiv:
- mplayer_put_key(f, '/');
- break;
- case wsLess:
- mplayer_put_key(f, '<');
- break;
- case wsMore:
- mplayer_put_key(f, '>');
- break;
- case wsGray0:
- mplayer_put_key(f, KEY_KP0);
- break;
- case wsGrayEnd:
- case wsGray1:
- mplayer_put_key(f, KEY_KP1);
- break;
- case wsGrayDown:
- case wsGray2:
- mplayer_put_key(f, KEY_KP2);
- break;
- case wsGrayPgDn:
- case wsGray3:
- mplayer_put_key(f, KEY_KP3);
- break;
- case wsGrayLeft:
- case wsGray4:
- mplayer_put_key(f, KEY_KP4);
- break;
- case wsGray5Dup:
- case wsGray5:
- mplayer_put_key(f, KEY_KP5);
- break;
- case wsGrayRight:
- case wsGray6:
- mplayer_put_key(f, KEY_KP6);
- break;
- case wsGrayHome:
- case wsGray7:
- mplayer_put_key(f, KEY_KP7);
- break;
- case wsGrayUp:
- case wsGray8:
- mplayer_put_key(f, KEY_KP8);
- break;
- case wsGrayPgUp:
- case wsGray9:
- mplayer_put_key(f, KEY_KP9);
- break;
- case wsGrayDecimal:
- mplayer_put_key(f, KEY_KPDEC);
- break;
- case wsGrayInsert:
- mplayer_put_key(f, KEY_KPINS);
- break;
- case wsGrayDelete:
- mplayer_put_key(f, KEY_KPDEL);
- break;
- case wsGrayEnter:
- mplayer_put_key(f, KEY_KPENTER);
- break;
- case wsGrave:
- mplayer_put_key(f, '`');
- break;
- case wsTilde:
- mplayer_put_key(f, '~');
- break;
- case wsExclSign:
- mplayer_put_key(f, '!');
- break;
- case wsAt:
- mplayer_put_key(f, '@');
- break;
- case wsHash:
- mplayer_put_key(f, '#');
- break;
- case wsDollar:
- mplayer_put_key(f, '$');
- break;
- case wsPercent:
- mplayer_put_key(f, '%');
- break;
- case wsCircumflex:
- mplayer_put_key(f, '^');
- break;
- case wsAmpersand:
- mplayer_put_key(f, '&');
- break;
- case wsobracket:
- mplayer_put_key(f, '(');
- break;
- case wscbracket:
- mplayer_put_key(f, ')');
- break;
- case wsUnder:
- mplayer_put_key(f, '_');
- break;
- case wsocbracket:
- mplayer_put_key(f, '{');
- break;
- case wsccbracket:
- mplayer_put_key(f, '}');
- break;
- case wsColon:
- mplayer_put_key(f, ':');
- break;
- case wsSemicolon:
- mplayer_put_key(f, ';');
- break;
- case wsDblQuote:
- mplayer_put_key(f, '\"');
- break;
- case wsAcute:
- mplayer_put_key(f, '\'');
- break;
- case wsComma:
- mplayer_put_key(f, ',');
- break;
- case wsPoint:
- mplayer_put_key(f, '.');
- break;
- case wsQuestSign:
- mplayer_put_key(f, '?');
- break;
- case wsBSlash:
- mplayer_put_key(f, '\\');
- break;
- case wsPipe:
- mplayer_put_key(f, '|');
- break;
- case wsEqual:
- mplayer_put_key(f, '=');
- break;
- case wsosbrackets:
- mplayer_put_key(f, '[');
- break;
- case wscsbrackets:
- mplayer_put_key(f, ']');
- break;
-
-
- default:
- if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z') ||
- (key >= '0' && key <= '9'))
- mplayer_put_key(f, key);
- }
+ static const char *passthrough_keys = " -+*/<>`~!@#$%^&()_{}:;\"\',.?\\|=[]";
+ int mpkey = 0;
+ int i;
+ if ((key >= 'a' && key <= 'z') ||
+ (key >= 'A' && key <= 'Z') ||
+ (key >= '0' && key <= '9') ||
+ (key > 0 && key < 256 && strchr(passthrough_keys, key)))
+ mpkey = key;
+
+ if (!mpkey)
+ mpkey = lookup_keymap_table(keymap, key);
+ if (mpkey)
+ mplayer_put_key(vo->key_fifo, mpkey);
}