Index: mplayer.c =================================================================== --- mplayer.c (revision 26012) +++ mplayer.c (working copy) @@ -2851,11 +2855,7 @@ mp_input_init(use_gui); mp_input_add_key_fd(-1,0,mplayer_get_key,NULL); if(slave_mode) -#ifndef __MINGW32__ - mp_input_add_cmd_fd(0,1,NULL,NULL); -#else - mp_input_add_cmd_fd(0,0,mp_input_win32_slave_cmd_func,NULL); -#endif + mp_input_add_cmd_fd(0,USE_SELECT,MP_INPUT_SLAVE_CMD_FUNC,NULL); else if(!noconsolecontrols) mp_input_add_event_fd(0, getch2); Index: osdep/getch2-os2.c =================================================================== --- osdep/getch2-os2.c (revision 0) +++ osdep/getch2-os2.c (revision 0) @@ -0,0 +1,204 @@ +/* + * getch2-os2.c : OS/2 TermIO for MPlayer + * + * Copyright (c) 2007 KO Myung-Hun (komh@chollian.net) + * + * 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 + */ + +#define INCL_KBD +#define INCL_VIO +#define INCL_DOS +#include + +#include + +#include "config.h" +#include "keycodes.h" +#include "input/input.h" +#include "mp_fifo.h" + +#if defined( USE_LANGINFO ) && defined( USE_ICONV ) +#include +#include +#endif + +int mp_input_slave_cmd_func( int fd, char *dest, int size ) +{ + PPIB ppib; + CHAR szPipeName[ 100 ]; + HFILE hpipe; + ULONG ulAction; + ULONG cbActual; + ULONG rc; + + DosGetInfoBlocks( NULL, &ppib ); + + sprintf( szPipeName, "\\PIPE\\MPLAYER\\%lx", ppib->pib_ulpid ); + + rc = DosOpen( szPipeName, &hpipe, &ulAction, 0, FILE_NORMAL, + OPEN_ACTION_OPEN_IF_EXISTS, + OPEN_SHARE_DENYREADWRITE | OPEN_ACCESS_READWRITE, + NULL ); + if( rc ) + return MP_INPUT_NOTHING; + + rc = DosRead( hpipe, dest, size, &cbActual ); + if( rc ) + return MP_INPUT_NOTHING; + + rc = cbActual; + + // Send ACK + DosWrite( hpipe, &rc, sizeof( ULONG ), &cbActual ); + + DosClose( hpipe ); + + return rc; +} + + +int screen_width = 80; +int screen_height = 24; +char *erase_to_end_of_line = NULL; + +void get_screen_size( void ) +{ + VIOMODEINFO vmi; + + vmi.cb = sizeof( VIOMODEINFO ); + + VioGetMode( &vmi, 0 ); + + screen_width = vmi.col; + screen_height = vmi.row; +} + +static int getch2_status = 0; + +static int getch2_internal( void ) +{ + KBDKEYINFO kki; + + if( !getch2_status ) + return -1; + + if( KbdCharIn( &kki, IO_NOWAIT, 0 )) + return -1; + + // key pressed ? + if( kki.fbStatus ) + { + // extended key ? + if(( kki.chChar == 0x00 ) || ( kki.chChar == 0xE0 )) + { + switch( kki.chScan ) + { + case 0x4B : // Left + return KEY_LEFT; + + case 0x48 : // Up + return KEY_UP; + + case 0x4D : // Right + return KEY_RIGHT; + + case 0x50 : // Down + return KEY_DOWN; + + case 0x53 : // Delete + return KEY_DELETE; + + case 0x52 : // Insert + return KEY_INSERT; + + case 0x47 : // Home + return KEY_HOME; + + case 0x4F : // End + return KEY_END; + + case 0x49 : // Page Up + return KEY_PAGE_UP; + + case 0x51 : // Page Down + return KEY_PAGE_DOWN; + } + } + else + { + switch( kki.chChar ) + { + case 0x08 : // Backspace + return KEY_BS; + + case 0x1B : // Esc + return KEY_ESC; + + case 0x0D : // Enter + // Keypad Enter ? + if( kki.chScan == 0xE0 ) + return KEY_KPENTER; + break; + } + + return kki.chChar; + } + } + + return -1; +} + +void getch2( void ) +{ + int key; + + key = getch2_internal(); + if( key != -1 ) + mplayer_put_key( key ); +} + +void getch2_enable( void ) +{ + getch2_status = 1; +} + +void getch2_disable( void ) +{ + getch2_status = 0; +} + +#ifdef USE_ICONV +char *get_term_charset( void ) +{ + char *charset = NULL; + +#ifdef USE_LANGINFO + setlocale( LC_CTYPE, ""); + charset = nl_langinfo( CODESET ); + setlocale( LC_CTYPE, "C"); +#endif + + return charset; +} +#endif + Index: osdep/getch2.h =================================================================== --- osdep/getch2.h (revision 26012) +++ osdep/getch2.h (working copy) @@ -24,8 +24,15 @@ /* Read a character or a special key code (see keycodes.h) */ extern void getch2(void); -#ifdef __MINGW32__ -extern int mp_input_win32_slave_cmd_func(int fd,char* dest,int size); +/* Slave cmd func for Win32 and OS/2 */ +extern int mp_input_slave_cmd_func(int fd,char* dest,int size); + +#if defined(__MINGW32__) || defined(__OS2__) +#define USE_SELECT 0 +#define MP_INPUT_SLAVE_CMD_FUNC mp_input_slave_cmd_func +#else +#define USE_SELECT 1 +#define MP_INPUT_SLAVE_CMD_FUNC NULL #endif #endif /* GETCH2_H */ Index: osdep/Makefile =================================================================== --- osdep/Makefile (revision 26012) +++ osdep/Makefile (working copy) @@ -24,8 +24,19 @@ ifeq ($(TARGET_OS),MINGW32) getch = getch2-win.c endif +ifeq ($(TARGET_OS),OS/2) +getch = getch2-os2.c +endif SRCS_COMMON += $(timer) SRCS_COMMON += $(getch) include ../mpcommon.mak Index: osdep/getch2-win.c =================================================================== --- osdep/getch2-win.c (revision 26012) +++ osdep/getch2-win.c (working copy) @@ -13,7 +13,7 @@ // HACK, stdin is used as something else below #undef stdin -int mp_input_win32_slave_cmd_func(int fd,char* dest,int size){ +int mp_input_slave_cmd_func(int fd,char* dest,int size){ DWORD retval; HANDLE stdin = GetStdHandle(STD_INPUT_HANDLE); if(!PeekNamedPipe(stdin, NULL, size, &retval, NULL, NULL) || !retval){