changeset 9766:afb1150cd5de

windows getch2 for MINGW32 port
author faust3
date Sun, 30 Mar 2003 21:20:04 +0000
parents 2d703cd325ee
children f6d2772efca3
files osdep/getch2-win.c
diffstat 1 files changed, 109 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/osdep/getch2-win.c	Sun Mar 30 21:20:04 2003 +0000
@@ -0,0 +1,109 @@
+/* windows TermIO for MPlayer          (C) 2003 Sascha Sommer */
+
+// See  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp
+// for additional virtual keycodes
+
+
+#include <windows.h>
+#include "keycodes.h"
+
+int screen_width=80;
+int screen_height=24;
+
+void get_screen_size(){
+}
+
+static HANDLE stdin;
+
+int getch2(int time){
+	INPUT_RECORD eventbuffer[128];
+    DWORD retval;
+   	int i=0;
+    /*check if there are input events*/
+	if(!GetNumberOfConsoleInputEvents(stdin,&retval))
+	{
+		printf("getch2: can't get number of input events: %i\n",GetLastError());
+		return -1;
+	}
+    if(retval<=0)return -1;
+    
+	/*read all events*/	
+	if(!ReadConsoleInput(stdin,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 KEY_HOME;
+					case VK_END:
+						return KEY_END;
+					case VK_DELETE:
+						return KEY_DEL;
+                    case VK_INSERT:
+						return KEY_INS;
+					case VK_BACK:
+						return KEY_BS;
+					case VK_PRIOR:
+						return KEY_PGUP;
+					case VK_NEXT:
+						return KEY_PGDWN;
+					case VK_RETURN:
+						return KEY_ENTER;
+					case VK_ESCAPE:
+						return KEY_ESC;
+					case VK_LEFT:
+						return KEY_LEFT;
+					case VK_UP:
+						return KEY_UP;
+					case VK_RIGHT:
+						return KEY_RIGHT;
+					case VK_DOWN:
+						return KEY_DOWN;
+					}
+					/*check for function keys*/
+        			if(eventbuffer[i].Event.KeyEvent.wVirtualKeyCode >= 0x70)
+						return (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;
+}
+
+static int getch2_status=0;
+
+void getch2_enable(){
+	stdin = GetStdHandle(STD_INPUT_HANDLE);
+    getch2_status=1;
+}
+
+void getch2_disable(){
+    if(!getch2_status) return; // already disabled / never enabled
+    getch2_status=0;
+}
+