From 25d4ae74f1dbddf99b147df0887d6810d34e36dd Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 19 Dec 2013 21:31:27 +0100 Subject: Rename getch2....c/h to terminal....c/h "getch2" really tells nothing about what the heck this code does. It'd be even worse when moving the rest of terminal handling code there. --- osdep/terminal-win.c | 194 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 osdep/terminal-win.c (limited to 'osdep/terminal-win.c') diff --git a/osdep/terminal-win.c b/osdep/terminal-win.c new file mode 100644 index 0000000000..a56d1a409c --- /dev/null +++ b/osdep/terminal-win.c @@ -0,0 +1,194 @@ +/* Windows TermIO + * + * copyright (C) 2003 Sascha Sommer + * + * 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. + */ + +// See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp +// for additional virtual keycodes + + +#include "config.h" +#include +#include +#include +#include +#include "input/keycodes.h" +#include "input/input.h" +#include "terminal.h" + +int mp_input_slave_cmd_func(int fd, char *dest, int size) +{ + DWORD retval; + HANDLE in = GetStdHandle(STD_INPUT_HANDLE); + if (PeekNamedPipe(in, NULL, size, &retval, NULL, NULL)) { + if (size > retval) + size = retval; + } else { + if (WaitForSingleObject(in, 0)) + size = 0; + } + if (!size) + return MP_INPUT_NOTHING; + ReadFile(in, dest, size, &retval, NULL); + if (retval) + return retval; + return MP_INPUT_NOTHING; +} + +int screen_width = 80; +int screen_height = 24; +char *erase_to_end_of_line = NULL; + +void get_screen_size(void) +{ + CONSOLE_SCREEN_BUFFER_INFO cinfo; + if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cinfo)) { + screen_width = cinfo.dwMaximumWindowSize.X; + screen_height = cinfo.dwMaximumWindowSize.Y; + } +} + +int load_termcap(char *termtype) +{ + return 0; +} + +static HANDLE in; +static int getch2_status = 0; + +static int getch2_internal(void) +{ + INPUT_RECORD eventbuffer[128]; + DWORD retval; + int i = 0; + if (!getch2_status) { + // supports e.g. MinGW xterm, unfortunately keys are only received after + // enter was pressed. + uint8_t c; + if (!PeekNamedPipe(in, NULL, 1, &retval, NULL, NULL) || !retval) + return -1; + ReadFile(in, &c, 1, &retval, NULL); + return retval == 1 ? c : -1; + } + /*check if there are input events*/ + if (!GetNumberOfConsoleInputEvents(in, &retval)) { + printf("getch2: can't get number of input events: %i\n", + (int)GetLastError()); + return -1; + } + if (retval <= 0) + return -1; + + /*read all events*/ + if (!ReadConsoleInput(in, eventbuffer, 128, &retval)) { + printf("getch: can't read input events\n"); + return -1; + } + + /*filter out keyevents*/ + for (i = 0; i < retval; i++) { + switch (eventbuffer[i].EventType) { + case KEY_EVENT: + /*only a pressed key is interresting for us*/ + if (eventbuffer[i].Event.KeyEvent.bKeyDown == TRUE) { + /*check for special keys*/ + switch (eventbuffer[i].Event.KeyEvent.wVirtualKeyCode) { + case VK_HOME: + return MP_KEY_HOME; + case VK_END: + return MP_KEY_END; + case VK_DELETE: + return MP_KEY_DEL; + case VK_INSERT: + return MP_KEY_INS; + case VK_BACK: + return MP_KEY_BS; + case VK_PRIOR: + return MP_KEY_PGUP; + case VK_NEXT: + return MP_KEY_PGDWN; + case VK_RETURN: + return MP_KEY_ENTER; + case VK_ESCAPE: + return MP_KEY_ESC; + case VK_LEFT: + return MP_KEY_LEFT; + case VK_UP: + return MP_KEY_UP; + case VK_RIGHT: + return MP_KEY_RIGHT; + case VK_DOWN: + return MP_KEY_DOWN; + case VK_SHIFT: + continue; + } + /*check for function keys*/ + if (0x87 >= eventbuffer[i].Event.KeyEvent.wVirtualKeyCode && + eventbuffer[i].Event.KeyEvent.wVirtualKeyCode >= 0x70) + return MP_KEY_F + 1 + + eventbuffer[i].Event.KeyEvent.wVirtualKeyCode - 0x70; + + /*only characters should be remaining*/ + //printf("getch2: YOU PRESSED \"%c\" \n",eventbuffer[i].Event.KeyEvent.uChar.AsciiChar); + return eventbuffer[i].Event.KeyEvent.uChar.AsciiChar; + } + break; + + case MOUSE_EVENT: + case WINDOW_BUFFER_SIZE_EVENT: + case FOCUS_EVENT: + case MENU_EVENT: + default: + //printf("getch2: unsupported event type"); + break; + } + } + return -1; +} + +bool getch2(struct input_ctx *ctx) +{ + int r = getch2_internal(); + if (r >= 0) + mp_input_put_key(ctx, r); + return true; +} + +void getch2_poll(void) +{ +} + +void getch2_enable(void) +{ + DWORD retval; + in = GetStdHandle(STD_INPUT_HANDLE); + if (!GetNumberOfConsoleInputEvents(in, &retval)) { + printf("getch2: %i can't get number of input events " + "[disabling console input]\n", (int)GetLastError()); + getch2_status = 0; + } else + getch2_status = 1; +} + +void getch2_disable(void) +{ + if (!getch2_status) + return; // already disabled / never enabled + getch2_status = 0; +} -- cgit v1.2.3