1111#include " cpp-terminal/tty.hpp"
1212
1313#include < string>
14+ #include < vector>
1415
1516char Term::Platform::read_raw_stdin ()
1617{
@@ -35,24 +36,28 @@ Term::Event Term::Platform::read_raw()
3536 GetNumberOfConsoleInputEvents (GetStdHandle (STD_INPUT_HANDLE), &nread);
3637 if (nread >= 1 )
3738 {
38- INPUT_RECORD buf;
39- if (!ReadConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &buf, 1 , &nread)) { Term::Exception (" ReadFile() failed" ); }
40- if (nread == 1 )
39+ DWORD nre{0 };
40+ std::vector<INPUT_RECORD> buf{nread};
41+ if (!ReadConsoleInput (GetStdHandle (STD_INPUT_HANDLE), &buf[0 ], buf.size (), &nre)) { Term::Exception (" ReadFile() failed" ); }
42+ std::string ret (nre, ' \0 ' );
43+ int processed{0 };
44+ for (std::size_t i = 0 ; i != nre; ++i)
4145 {
42- switch (buf.EventType )
46+ switch (buf[i] .EventType )
4347 {
4448 case KEY_EVENT:
4549 {
46- // if(buf.Event.KeyEvent.bKeyDown)std::cout<<buf.Event.KeyEvent.wVirtualKeyCode<<" "<<buf.Event.KeyEvent.uChar.AsciiChar<<std::endl;
47- WORD skip = buf.Event .KeyEvent .wVirtualKeyCode ; // skip them for now
48- if (skip == VK_SHIFT || skip == VK_LWIN || skip == VK_RWIN || skip == VK_APPS || skip == VK_CONTROL || skip == VK_MENU || skip == VK_CAPITAL) { return Event (); }
49- if (buf.Event .KeyEvent .bKeyDown )
50+ WORD skip = buf[i].Event .KeyEvent .wVirtualKeyCode ; // skip them for now
51+ if (skip == VK_SHIFT || skip == VK_LWIN || skip == VK_RWIN || skip == VK_APPS || skip == VK_CONTROL || skip == VK_MENU || skip == VK_CAPITAL) break ;
52+ if (buf[i].Event .KeyEvent .bKeyDown )
5053 {
51- if (buf.Event .KeyEvent .uChar .AsciiChar != 0 ) return Event (buf.Event .KeyEvent .uChar .AsciiChar );
52- else
53- switch (buf.Event .KeyEvent .wVirtualKeyCode )
54+ if (buf[i].Event .KeyEvent .uChar .AsciiChar != 0 ) ret[processed] = buf[i].Event .KeyEvent .uChar .AsciiChar ;
55+ ++processed;
56+ break ;
57+ /* else
58+ switch(buf[i].Event.KeyEvent.wVirtualKeyCode)
5459 {
55- case VK_CLEAR: return Key (Term::Key::Value::NUMERIC_5);
60+ case VK_CLEAR: return Event(""); Key(Term::Key::Value::NUMERIC_5);
5661 case VK_PRIOR: return Key(Term::Key::Value::PAGE_UP);
5762 case VK_NEXT: return Key(Term::Key::Value::PAGE_DOWN);
5863 case VK_END: return Key(Term::Key::Value::END);
@@ -63,7 +68,7 @@ Term::Event Term::Platform::read_raw()
6368 case VK_DOWN: return Key(Term::Key::Value::ARROW_DOWN);
6469 case VK_SNAPSHOT: return Key(Term::Key::Value::PRINT_SCREEN);
6570 case VK_INSERT: return Key(Term::Key::Value::INSERT);
66- case VK_DELETE: return Key (Term::Key::Value::Delete );
71+ case VK_DELETE: return Key(Term::Key::Value::DEL );
6772 case VK_F1: return Key(Term::Key::Value::F1);
6873 case VK_F2: return Key(Term::Key::Value::F2);
6974 case VK_F3: return Key(Term::Key::Value::F3);
@@ -88,10 +93,10 @@ Term::Event Term::Platform::read_raw()
8893 case VK_F22: return Key(Term::Key::Value::F22);
8994 case VK_F23: return Key(Term::Key::Value::F23);
9095 case VK_F24: return Key(Term::Key::Value::F24);
91- }
96+ }*/
9297 }
9398 else
94- return Event () ;
99+ break ;
95100 }
96101 case FOCUS_EVENT:
97102 case MENU_EVENT:
@@ -100,7 +105,7 @@ Term::Event Term::Platform::read_raw()
100105 default : return Event ();
101106 }
102107 }
103- else { throw Term::Exception ( " kbhit() and ReadFile() inconsistent " ); }
108+ return Event (ret. c_str ());
104109 }
105110 else
106111 return Event ();
0 commit comments