Index: mplayer.c =================================================================== --- mplayer.c (revision 26012) +++ mplayer.c (working copy) @@ -2851,10 +2855,12 @@ mp_input_init(use_gui); mp_input_add_key_fd(-1,0,mplayer_get_key,NULL); if(slave_mode) -#ifndef __MINGW32__ +#ifdef __MINGW32__ + mp_input_add_cmd_fd(0,0,mp_input_win32_slave_cmd_func,NULL); +#elif defined(__OS2__) + mp_input_add_cmd_fd(0,0,mp_input_os2_slave_cmd_func,NULL); +#else 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 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) + * + * This program 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. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Changes : + * KO Myung-Hun 2007/10/28 + * - Support new type getch2() + * + * KO Myung-Hun 2008/01/26 + * - Support 'Keypad Enter' + */ + +#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_os2_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) @@ -28,4 +28,8 @@ extern int mp_input_win32_slave_cmd_func(int fd,char* dest,int size); #endif +#ifdef __OS2__ +extern int mp_input_os2_slave_cmd_func(int fd,char* dest,int size); +#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)